Re: [PATCH v3 51/51] x86/mm: convert arch_within_stack_frames() to use the new unwinder

From: Josh Poimboeuf
Date: Fri Aug 12 2016 - 15:15:46 EST


On Fri, Aug 12, 2016 at 10:38:31AM -0700, Kees Cook wrote:
> On Fri, Aug 12, 2016 at 8:17 AM, Josh Poimboeuf <jpoimboe@xxxxxxxxxx> 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 <jpoimboe@xxxxxxxxxx>
> >> ---
> >> 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.)

Right, only the frame pointer unwinder will be used here, thanks to the
CONFIG_FRAME_POINTER guard in thread_info.h.

--
Josh