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

stddef: Remove token-pasting in TRAILING_OVERLAP()

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>

authored by

Gustavo A. R. Silva and committed by
Kees Cook
413187f7 01c7344e

+1 -1
+1 -1
include/linux/stddef.h
··· 108 108 union { \ 109 109 TYPE NAME; \ 110 110 struct { \ 111 - unsigned char __offset_to_##FAM[offsetof(TYPE, FAM)]; \ 111 + unsigned char __offset_to_FAM[offsetof(TYPE, FAM)]; \ 112 112 MEMBERS \ 113 113 }; \ 114 114 }