• A
    string.h: workaround for increased stack usage · 146734b0
    Arnd Bergmann 提交于
    The hardened strlen() function causes rather large stack usage in at
    least one file in the kernel, in particular when CONFIG_KASAN is
    enabled:
    
      drivers/media/usb/em28xx/em28xx-dvb.c: In function 'em28xx_dvb_init':
      drivers/media/usb/em28xx/em28xx-dvb.c:2062:1: error: the frame size of 3256 bytes is larger than 204 bytes [-Werror=frame-larger-than=]
    
    Analyzing this problem led to the discovery that gcc fails to merge the
    stack slots for the i2c_board_info[] structures after we strlcpy() into
    them, due to the 'noreturn' attribute on the source string length check.
    
    I reported this as a gcc bug, but it is unlikely to get fixed for gcc-8,
    since it is relatively easy to work around, and it gets triggered
    rarely.  An earlier workaround I did added an empty inline assembly
    statement before the call to fortify_panic(), which works surprisingly
    well, but is really ugly and unintuitive.
    
    This is a new approach to the same problem, this time addressing it by
    not calling the 'extern __real_strnlen()' function for string constants
    where __builtin_strlen() is a compile-time constant and therefore known
    to be safe.
    
    We do this by checking if the last character in the string is a
    compile-time constant '\0'.  If it is, we can assume that strlen() of
    the string is also constant.
    
    As a side-effect, this should also improve the object code output for
    any other call of strlen() on a string constant.
    
    [akpm@linux-foundation.org: add comment]
    Link: http://lkml.kernel.org/r/20171205215143.3085755-1-arnd@arndb.de
    Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82365
    Link: https://patchwork.kernel.org/patch/9980413/
    Link: https://patchwork.kernel.org/patch/9974047/
    Fixes: 6974f0c4 ("include/linux/string.h: add the option of fortified string.h functions")
    Signed-off-by: NArnd Bergmann <arnd@arndb.de>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
    Cc: Daniel Micay <danielmicay@gmail.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Martin Wilck <mwilck@suse.com>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    146734b0
string.h 13.0 KB