]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
stddef: Remove token-pasting in TRAILING_OVERLAP()
authorGustavo A. R. Silva <gustavoars@kernel.org>
Wed, 17 Sep 2025 13:26:49 +0000 (15:26 +0200)
committerKees Cook <kees@kernel.org>
Wed, 17 Sep 2025 16:29:43 +0000 (09:29 -0700)
Currently, TRAILING_OVERLAP() token-pastes the FAM parameter into the
name of internal pdding member `__offset_to_##FAM`. This forces FAM to
be a single identifier, which prevents callers from using a FAM when
it's a nested member. For instance, see the following scenario:

| struct flex {
|  size_t count;
|  int data[];
| };

| struct foo {
|  int hdr_foo;
|  struct flex f;
| };

| struct composite {
|  struct foo hdr;
|  int data[100];
| };

In this case, it'd be useful if TRAILING_OVERLAP() could be used in
the following way:

| struct composite {
|  TRAILING_OVERLAP(struct foo, hdr, f.data,
|  int data[100];
|  );
| };

However, this is not current possible due to the token concatenation
in `__offset_to_##FAM`, which fails when FAM contains a dot.

So, remove token-pasting and use the fixed internal name
`__offset_to_FAM` and, with this, expand the capabilities of
TRAILING_OVERLAP(). :)

Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Link: https://lore.kernel.org/r/13b3e0a69aad837b4e32ca8269b9d91bf1fbe9ef.1758115257.git.gustavoars@kernel.org
Signed-off-by: Kees Cook <kees@kernel.org>
include/linux/stddef.h

index dab49e2ec8c0af8b13f9502dc622680515828f52..701099c67c240aecc3b39b53d4aff5a13d1c8ecf 100644 (file)
@@ -108,7 +108,7 @@ enum {
        union {                                                                 \
                TYPE NAME;                                                      \
                struct {                                                        \
-                       unsigned char __offset_to_##FAM[offsetof(TYPE, FAM)];   \
+                       unsigned char __offset_to_FAM[offsetof(TYPE, FAM)];     \
                        MEMBERS                                                 \
                };                                                              \
        }