]> www.infradead.org Git - users/jedix/linux-maple.git/commit
stddef: make __struct_group() UAPI C++-friendly
authorAlexander Lobakin <aleksander.lobakin@intel.com>
Thu, 19 Dec 2024 13:57:34 +0000 (14:57 +0100)
committerKees Cook <kees@kernel.org>
Fri, 20 Dec 2024 17:05:53 +0000 (09:05 -0800)
commit724c6ce38bbaeb4b3f109b0e066d6c0ecd15446c
tree3dee9becfb7212a78fc2c6152287d8c9515be5cf
parent239d87327dcd361b0098038995f8908f3296864f
stddef: make __struct_group() UAPI C++-friendly

For the most part of the C++ history, it couldn't have type
declarations inside anonymous unions for different reasons. At the
same time, __struct_group() relies on the latters, so when the @TAG
argument is not empty, C++ code doesn't want to build (even under
`extern "C"`):

../linux/include/uapi/linux/pkt_cls.h:25:24: error:
'struct tc_u32_sel::<unnamed union>::tc_u32_sel_hdr,' invalid;
an anonymous union may only have public non-static data members
[-fpermissive]

The safest way to fix this without trying to switch standards (which
is impossible in UAPI anyway) etc., is to disable tag declaration
for that language. This won't break anything since for now it's not
buildable at all.
Use a separate definition for __struct_group() when __cplusplus is
defined to mitigate the error, including the version from tools/.

Fixes: 50d7bd38c3aa ("stddef: Introduce struct_group() helper macro")
Reported-by: Christopher Ferris <cferris@google.com>
Closes: https://lore.kernel.org/linux-hardening/Z1HZpe3WE5As8UAz@google.com
Suggested-by: Kees Cook <kees@kernel.org> # __struct_group_tag()
Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Link: https://lore.kernel.org/r/20241219135734.2130002-1-aleksander.lobakin@intel.com
Signed-off-by: Kees Cook <kees@kernel.org>
include/uapi/linux/stddef.h
tools/include/uapi/linux/stddef.h