linux/drivers/char/tpm
Kees Cook 3c8ba0d61d kernel.h: Retain constant expression output for max()/min()
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/845

Co-Developed-by: Linus Torvalds <torvalds@linux-foundation.org>
Co-Developed-by: Martin Uecker <Martin.Uecker@med.uni-goettingen.de>
Signed-off-by: Kees Cook <keescook@chromium.org>
Acked-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2018-04-05 14:17:16 -07:00
..
st33zp24 tpm: st33zp24: fix potential buffer overruns caused by bit glitches on the bus 2018-02-26 15:43:45 -08:00
Kconfig tpm: Move Linux RNG connection to hwrng 2018-01-08 12:58:36 +02:00
Makefile tpm: parse TPM event logs based on EFI table 2018-01-08 12:58:35 +02:00
tpm-chip.c tpm: Move Linux RNG connection to hwrng 2018-01-08 12:58:36 +02:00
tpm-dev-common.c treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
tpm-dev.c tpm: split out tpm-dev.c into tpm-dev.c and tpm-common-dev.c 2017-04-03 22:46:01 +03:00
tpm-dev.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
tpm-interface.c tpm: fix potential buffer overruns caused by bit glitches on the bus 2018-02-26 15:43:46 -08:00
tpm-sysfs.c tpm: migrate pubek_show to struct tpm_buf 2017-10-12 14:28:59 +03:00
tpm.h tpm: return a TPM_RC_COMMAND_CODE response if command is not implemented 2018-01-08 12:58:36 +02:00
tpm1_eventlog.c tpm: parse TPM event logs based on EFI table 2018-01-08 12:58:35 +02:00
tpm2-cmd.c tpm: fix potential buffer overruns caused by bit glitches on the bus 2018-02-26 15:43:46 -08:00
tpm2-space.c tpm: fix type of a local variable in tpm2_map_command() 2017-10-18 18:28:48 +03:00
tpm2_eventlog.c tpm: move tpm_eventlog.h outside of drivers folder 2018-01-08 12:58:34 +02:00
tpm_atmel.c tpm/tpm_atmel: remove unnecessary NULL check 2017-06-19 02:36:04 +02:00
tpm_atmel.h tpm: remove tpm_read_index and tpm_write_index from tpm.h 2017-02-03 22:03:14 +02:00
tpm_crb.c tpm/tpm_crb: Use start method value from ACPI table directly 2017-10-18 18:28:45 +03:00
tpm_eventlog_acpi.c tpm: parse TPM event logs based on EFI table 2018-01-08 12:58:35 +02:00
tpm_eventlog_efi.c tpm: parse TPM event logs based on EFI table 2018-01-08 12:58:35 +02:00
tpm_eventlog_of.c tpm: parse TPM event logs based on EFI table 2018-01-08 12:58:35 +02:00
tpm_i2c_atmel.c tpm: Factor out common startup code 2016-07-19 17:43:38 +03:00
tpm_i2c_infineon.c tpm_i2c_infineon: fix potential buffer overruns caused by bit glitches on the bus 2018-02-26 15:43:44 -08:00
tpm_i2c_nuvoton.c tpm_i2c_nuvoton: fix potential buffer overruns caused by bit glitches on the bus 2018-02-26 15:43:44 -08:00
tpm_ibmvtpm.c tpm: ibmvtpm: simplify crq initialization and document crq format 2017-09-23 21:51:38 -07:00
tpm_ibmvtpm.h
tpm_infineon.c tpm: replace msleep() with usleep_range() in TPM 1.2/2.0 generic drivers 2017-09-23 21:51:00 -07:00
tpm_nsc.c tpm: remove tpm_read_index and tpm_write_index from tpm.h 2017-02-03 22:03:14 +02:00
tpm_ppi.c ACPI: Switch to use generic guid_t in acpi_evaluate_dsm() 2017-06-07 12:20:49 +02:00
tpm_tis.c tpm: remove unused variables 2018-01-08 12:58:54 +02:00
tpm_tis_core.c tpm_tis: fix potential buffer overruns caused by bit glitches on the bus 2018-02-26 15:43:43 -08:00
tpm_tis_core.h kernel.h: Retain constant expression output for max()/min() 2018-04-05 14:17:16 -07:00
tpm_tis_spi.c tpm: fix type of a local variables in tpm_tis_spi.c 2017-10-18 18:28:48 +03:00
tpm_vtpm_proxy.c vfs: do bulk POLL* -> EPOLL* replacement 2018-02-11 14:34:03 -08:00
tpmrm-dev.c tpm, tpmrm: Mark tpmrm_write as static 2017-06-13 22:02:08 +03:00
xen-tpmfront.c tpm: move wait_for_tpm_stat() to respective driver files 2017-12-16 20:27:32 +02:00