Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

gcc-plugins: randstruct: Only warn about true flexible arrays

The randstruct GCC plugin tried to discover "fake" flexible arrays
to issue warnings about them in randomized structs. In the future
LSM overhead reduction series, it would be legal to have a randomized
struct with a 1-element array, and this should _not_ be treated as a
flexible array, especially since commit df8fc4e934c1 ("kbuild: Enable
-fstrict-flex-arrays=3"). Disable the 0-sized and 1-element array
discovery logic in the plugin, but keep the "true" flexible array check.

Cc: KP Singh <kpsingh@kernel.org>
Cc: linux-hardening@vger.kernel.org
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202311021532.iBwuZUZ0-lkp@intel.com/
Fixes: df8fc4e934c1 ("kbuild: Enable -fstrict-flex-arrays=3")
Reviewed-by: Bill Wendling <morbo@google.com>
Acked-by: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Link: https://lore.kernel.org/r/20231104204334.work.160-kees@kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>

-10
-10
scripts/gcc-plugins/randomize_layout_plugin.c
··· 278 278 { 279 279 const_tree fieldtype; 280 280 const_tree typesize; 281 - const_tree elemtype; 282 - const_tree elemsize; 283 281 284 282 fieldtype = TREE_TYPE(field); 285 283 typesize = TYPE_SIZE(fieldtype); ··· 285 287 if (TREE_CODE(fieldtype) != ARRAY_TYPE) 286 288 return false; 287 289 288 - elemtype = TREE_TYPE(fieldtype); 289 - elemsize = TYPE_SIZE(elemtype); 290 - 291 290 /* size of type is represented in bits */ 292 291 293 292 if (typesize == NULL_TREE && TYPE_DOMAIN(fieldtype) != NULL_TREE && 294 293 TYPE_MAX_VALUE(TYPE_DOMAIN(fieldtype)) == NULL_TREE) 295 - return true; 296 - 297 - if (typesize != NULL_TREE && 298 - (TREE_CONSTANT(typesize) && (!tree_to_uhwi(typesize) || 299 - tree_to_uhwi(typesize) == tree_to_uhwi(elemsize)))) 300 294 return true; 301 295 302 296 return false;