• Arnd Bergmann's avatar
    tty: improve tty_insert_flip_char() fast path · 979990c6
    Arnd Bergmann authored
    kernelci.org reports a crazy stack usage for the VT code when CONFIG_KASAN
    is enabled:
    
    drivers/tty/vt/keyboard.c: In function 'kbd_keycode':
    drivers/tty/vt/keyboard.c:1452:1: error: the frame size of 2240 bytes is larger than 2048 bytes [-Werror=frame-larger-than=]
    
    The problem is that tty_insert_flip_char() gets inlined many times into
    kbd_keycode(), and also into other functions, and each copy requires 128
    bytes for stack redzone to check for a possible out-of-bounds access on
    the 'ch' and 'flags' arguments that are passed into
    tty_insert_flip_string_flags as a variable-length string.
    
    This introduces a new __tty_insert_flip_char() function for the slow
    path, which receives the two arguments by value. This completely avoids
    the problem and the stack usage goes back down to around 100 bytes.
    
    Without KASAN, this is also slightly better, as we don't have to
    spill the arguments to the stack but can simply pass 'ch' and 'flag'
    in registers, saving a few bytes in .text for each call site.
    
    This should be backported to linux-4.0 or later, which first introduced
    the stack sanitizer in the kernel.
    
    Cc: stable@vger.kernel.org
    Fixes: c420f167 ("kasan: enable stack instrumentation")
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    979990c6
tty_buffer.c 15.9 KB