• Arnd Bergmann's avatar
    structleak: disable STRUCTLEAK_BYREF in combination with KASAN_STACK · 173e6ee2
    Arnd Bergmann authored
    The combination of KASAN_STACK and GCC_PLUGIN_STRUCTLEAK_BYREF
    leads to much larger kernel stack usage, as seen from the warnings
    about functions that now exceed the 2048 byte limit:
    
    drivers/media/i2c/tvp5150.c:253:1: error: the frame size of 3936 bytes is larger than 2048 bytes
    drivers/media/tuners/r820t.c:1327:1: error: the frame size of 2816 bytes is larger than 2048 bytes
    drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_n.c:16552:1: error: the frame size of 3144 bytes is larger than 2048 bytes [-Werror=frame-larger-than=]
    fs/ocfs2/aops.c:1892:1: error: the frame size of 2088 bytes is larger than 2048 bytes
    fs/ocfs2/dlm/dlmrecovery.c:737:1: error: the frame size of 2088 bytes is larger than 2048 bytes
    fs/ocfs2/namei.c:1677:1: error: the frame size of 2584 bytes is larger than 2048 bytes
    fs/ocfs2/super.c:1186:1: error: the frame size of 2640 bytes is larger than 2048 bytes
    fs/ocfs2/xattr.c:3678:1: error: the frame size of 2176 bytes is larger than 2048 bytes
    net/bluetooth/l2cap_core.c:7056:1: error: the frame size of 2144 bytes is larger than 2048 bytes [-Werror=frame-larger-than=]
    net/bluetooth/l2cap_core.c: In function 'l2cap_recv_frame':
    net/bridge/br_netlink.c:1505:1: error: the frame size of 2448 bytes is larger than 2048 bytes
    net/ieee802154/nl802154.c:548:1: error: the frame size of 2232 bytes is larger than 2048 bytes
    net/wireless/nl80211.c:1726:1: error: the frame size of 2224 bytes is larger than 2048 bytes
    net/wireless/nl80211.c:2357:1: error: the frame size of 4584 bytes is larger than 2048 bytes
    net/wireless/nl80211.c:5108:1: error: the frame size of 2760 bytes is larger than 2048 bytes
    net/wireless/nl80211.c:6472:1: error: the frame size of 2112 bytes is larger than 2048 bytes
    
    The structleak plugin was previously disabled for CONFIG_COMPILE_TEST,
    but meant we missed some bugs, so this time we should address them.
    
    The frame size warnings are distracting, and risking a kernel stack
    overflow is generally not beneficial to performance, so it may be best
    to disallow that particular combination. This can be done by turning
    off either one. I picked the dependency in GCC_PLUGIN_STRUCTLEAK_BYREF
    and GCC_PLUGIN_STRUCTLEAK_BYREF_ALL, as this option is designed to
    make uninitialized stack usage less harmful when enabled on its own,
    but it also prevents KASAN from detecting those cases in which it was
    in fact needed.
    
    KASAN_STACK is currently implied by KASAN on gcc, but could be made a
    user selectable option if we want to allow combining (non-stack) KASAN
    with GCC_PLUGIN_STRUCTLEAK_BYREF.
    
    Note that it would be possible to specifically address the files that
    print the warning, but presumably the overall stack usage is still
    significantly higher than in other configurations, so this would not
    address the full problem.
    
    I could not test this with CONFIG_INIT_STACK_ALL, which may or may not
    suffer from a similar problem.
    
    Fixes: 81a56f6d ("gcc-plugins: structleak: Generalize to all variable types")
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Link: https://lore.kernel.org/r/20190722114134.3123901-1-arnd@arndb.deSigned-off-by: default avatarKees Cook <keescook@chromium.org>
    173e6ee2
Kconfig.hardening 6.45 KB