Commit f0bc704f authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull hardening fix from Kees Cook:

 - stddef: make __struct_group() UAPI C++-friendly (Alexander Lobakin)

* tag 'hardening-v6.13-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
  stddef: make __struct_group() UAPI C++-friendly
parents 2c2b3d90 724c6ce3
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -8,6 +8,13 @@
#define __always_inline inline
#endif

/* Not all C++ standards support type declarations inside an anonymous union */
#ifndef __cplusplus
#define __struct_group_tag(TAG)		TAG
#else
#define __struct_group_tag(TAG)
#endif

/**
 * __struct_group() - Create a mirrored named and anonyomous struct
 *
@@ -20,13 +27,13 @@
 * and size: one anonymous and one named. The former's members can be used
 * normally without sub-struct naming, and the latter can be used to
 * reason about the start, end, and size of the group of struct members.
 * The named struct can also be explicitly tagged for layer reuse, as well
 * as both having struct attributes appended.
 * The named struct can also be explicitly tagged for layer reuse (C only),
 * as well as both having struct attributes appended.
 */
#define __struct_group(TAG, NAME, ATTRS, MEMBERS...) \
	union { \
		struct { MEMBERS } ATTRS; \
		struct TAG { MEMBERS } ATTRS NAME; \
		struct __struct_group_tag(TAG) { MEMBERS } ATTRS NAME; \
	} ATTRS

#ifdef __cplusplus
+11 −4
Original line number Diff line number Diff line
@@ -8,6 +8,13 @@
#define __always_inline __inline__
#endif

/* Not all C++ standards support type declarations inside an anonymous union */
#ifndef __cplusplus
#define __struct_group_tag(TAG)		TAG
#else
#define __struct_group_tag(TAG)
#endif

/**
 * __struct_group() - Create a mirrored named and anonyomous struct
 *
@@ -20,14 +27,14 @@
 * and size: one anonymous and one named. The former's members can be used
 * normally without sub-struct naming, and the latter can be used to
 * reason about the start, end, and size of the group of struct members.
 * The named struct can also be explicitly tagged for layer reuse, as well
 * as both having struct attributes appended.
 * The named struct can also be explicitly tagged for layer reuse (C only),
 * as well as both having struct attributes appended.
 */
#define __struct_group(TAG, NAME, ATTRS, MEMBERS...) \
	union { \
		struct { MEMBERS } ATTRS; \
		struct TAG { MEMBERS } ATTRS NAME; \
	}
		struct __struct_group_tag(TAG) { MEMBERS } ATTRS NAME; \
	} ATTRS

/**
 * __DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union