On Fri, Aug 12, 2016 at 8:17 AM, Josh Poimboeuf <[email protected]> wrote: > On Fri, Aug 12, 2016 at 09:29:10AM -0500, Josh Poimboeuf wrote: >> Convert arch_within_stack_frames() to use the new unwinder. >> >> Boot tested with CONFIG_HARDENED_USERCOPY. >> >> Signed-off-by: Josh Poimboeuf <[email protected]> >> --- >> arch/x86/lib/usercopy.c | 25 +++++++++++++++++++------ >> 1 file changed, 19 insertions(+), 6 deletions(-) >> >> diff --git a/arch/x86/lib/usercopy.c b/arch/x86/lib/usercopy.c >> index 96ce151..9d0913c 100644 >> --- a/arch/x86/lib/usercopy.c >> +++ b/arch/x86/lib/usercopy.c >> @@ -50,12 +50,21 @@ int arch_within_stack_frames(const void * const stack, >> const void * const stackend, >> const void *obj, unsigned long len) >> { >> - const void *frame = NULL; >> - const void *oldframe; >> + struct unwind_state state; >> + const void *frame, *oldframe; >> + >> + unwind_start(&state, current, NULL, NULL); >> + >> + if (!unwind_next_frame(&state)) >> + return 0; >> + >> + oldframe = unwind_get_stack_ptr(&state); > > Actually, I think this isn't quite right. Now that the function isn't > inlined, this needs to unwind another frame to be equivalent to current > behavior.
Yeah, that seems right. And IIUC, as long as this is wrapped in the CONFIG_FRAME_POINTER check, this won't use the guessing unwinder, right? (Which is how it should be.) -Kees -- Kees Cook Nexus Security

