• K
    kernel.h: Retain constant expression output for max()/min() · 3c8ba0d6
    Kees Cook 提交于
    In the effort to remove all VLAs from the kernel[1], it is desirable to
    build with -Wvla.  However, this warning is overly pessimistic, in that
    it is only happy with stack array sizes that are declared as constant
    expressions, and not constant values.  One case of this is the
    evaluation of the max() macro which, due to its construction, ends up
    converting constant expression arguments into a constant value result.
    
    All attempts to rewrite this macro with __builtin_constant_p() failed
    with older compilers (e.g.  gcc 4.4)[2].  However, Martin Uecker,
    constructed[3] a mind-shattering solution that works everywhere.
    Cthulhu fhtagn!
    
    This patch updates the min()/max() macros to evaluate to a constant
    expression when called on constant expression arguments.  This removes
    several false-positive stack VLA warnings from an x86 allmodconfig build
    when -Wvla is added:
    
      $ diff -u before.txt after.txt | grep ^-
      -drivers/input/touchscreen/cyttsp4_core.c:871:2: warning: ISO C90 forbids variable length array ‘ids’ [-Wvla]
      -fs/btrfs/tree-checker.c:344:4: warning: ISO C90 forbids variable length array ‘namebuf’ [-Wvla]
      -lib/vsprintf.c:747:2: warning: ISO C90 forbids variable length array ‘sym’ [-Wvla]
      -net/ipv4/proc.c:403:2: warning: ISO C90 forbids variable length array ‘buff’ [-Wvla]
      -net/ipv6/proc.c:198:2: warning: ISO C90 forbids variable length array ‘buff’ [-Wvla]
      -net/ipv6/proc.c:218:2: warning: ISO C90 forbids variable length array ‘buff64’ [-Wvla]
    
    This also updates two cases where different enums were being compared
    and explicitly casts them to int (which matches the old side-effect of
    the single-evaluation code): one in tpm/tpm_tis_core.h, and one in
    drm/drm_color_mgmt.c.
    
     [1] https://lkml.org/lkml/2018/3/7/621
     [2] https://lkml.org/lkml/2018/3/10/170
     [3] https://lkml.org/lkml/2018/3/20/845Co-Developed-by: NLinus Torvalds <torvalds@linux-foundation.org>
    Co-Developed-by: NMartin Uecker <Martin.Uecker@med.uni-goettingen.de>
    Signed-off-by: NKees Cook <keescook@chromium.org>
    Acked-by: NIngo Molnar <mingo@kernel.org>
    Acked-by: NMiguel Ojeda <miguel.ojeda.sandonis@gmail.com>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    3c8ba0d6
tpm_tis_core.h 4.7 KB