• Mark Rutland's avatar
    stackleak: rework stack low bound handling · 9ec79840
    Mark Rutland authored
    In stackleak_task_init(), stackleak_track_stack(), and
    __stackleak_erase(), we open-code skipping the STACK_END_MAGIC at the
    bottom of the stack. Each case is implemented slightly differently, and
    only the __stackleak_erase() case is commented.
    
    In stackleak_task_init() and stackleak_track_stack() we unconditionally
    add sizeof(unsigned long) to the lowest stack address. In
    stackleak_task_init() we use end_of_stack() for this, and in
    stackleak_track_stack() we use task_stack_page(). In __stackleak_erase()
    we handle this by detecting if `kstack_ptr` has hit the stack end
    boundary, and if so, conditionally moving it above the magic.
    
    This patch adds a new stackleak_task_low_bound() helper which is used in
    all three cases, which unconditionally adds sizeof(unsigned long) to the
    lowest address on the task stack, with commentary as to why. This uses
    end_of_stack() as stackleak_task_init() did prior to this patch, as this
    is consistent with the code in kernel/fork.c which initializes the
    STACK_END_MAGIC value.
    
    In __stackleak_erase() we no longer need to check whether we've spilled
    into the STACK_END_MAGIC value, as stackleak_track_stack() ensures that
    `current->lowest_stack` stops immediately above this, and similarly the
    poison scan will stop immediately above this.
    
    For stackleak_task_init() and stackleak_track_stack() this results in no
    change to code generation. For __stackleak_erase() the generated
    assembly is slightly simpler and shorter.
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Cc: Alexander Popov <alex.popov@linux.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Kees Cook <keescook@chromium.org>
    Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/20220427173128.2603085-5-mark.rutland@arm.com
    9ec79840
stackleak.c 3.82 KB