aboutsummaryrefslogtreecommitdiffstats
path: root/queue-5.10/randstruct-gcc-plugin-remove-bogus-void-member.patch
diff options
Diffstat (limited to 'queue-5.10/randstruct-gcc-plugin-remove-bogus-void-member.patch')
-rw-r--r--queue-5.10/randstruct-gcc-plugin-remove-bogus-void-member.patch119
1 files changed, 0 insertions, 119 deletions
diff --git a/queue-5.10/randstruct-gcc-plugin-remove-bogus-void-member.patch b/queue-5.10/randstruct-gcc-plugin-remove-bogus-void-member.patch
deleted file mode 100644
index 7e1a0ad3a8b..00000000000
--- a/queue-5.10/randstruct-gcc-plugin-remove-bogus-void-member.patch
+++ /dev/null
@@ -1,119 +0,0 @@
-From 17c7c8f398bc703607bfe1360e581a5905a903dc Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 26 Apr 2025 00:37:52 -0700
-Subject: randstruct: gcc-plugin: Remove bogus void member
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Kees Cook <kees@kernel.org>
-
-[ Upstream commit e136a4062174a9a8d1c1447ca040ea81accfa6a8 ]
-
-When building the randomized replacement tree of struct members, the
-randstruct GCC plugin would insert, as the first member, a 0-sized void
-member. This appears as though it was done to catch non-designated
-("unnamed") static initializers, which wouldn't be stable since they
-depend on the original struct layout order.
-
-This was accomplished by having the side-effect of the "void member"
-tripping an assert in GCC internals (count_type_elements) if the member
-list ever needed to be counted (e.g. for figuring out the order of members
-during a non-designated initialization), which would catch impossible type
-(void) in the struct:
-
-security/landlock/fs.c: In function ‘hook_file_ioctl_common’:
-security/landlock/fs.c:1745:61: internal compiler error: in count_type_elements, at expr.cc:7075
- 1745 | .u.op = &(struct lsm_ioctlop_audit) {
- | ^
-
-static HOST_WIDE_INT
-count_type_elements (const_tree type, bool for_ctor_p)
-{
- switch (TREE_CODE (type))
-...
- case VOID_TYPE:
- default:
- gcc_unreachable ();
- }
-}
-
-However this is a redundant safety measure since randstruct uses the
-__designated_initializer attribute both internally and within the
-__randomized_layout attribute macro so that this would be enforced
-by the compiler directly even when randstruct was not enabled (via
--Wdesignated-init).
-
-A recent change in Landlock ended up tripping the same member counting
-routine when using a full-struct copy initializer as part of an anonymous
-initializer. This, however, is a false positive as the initializer is
-copying between identical structs (and hence identical layouts). The
-"path" member is "struct path", a randomized struct, and is being copied
-to from another "struct path", the "f_path" member:
-
- landlock_log_denial(landlock_cred(file->f_cred), &(struct landlock_request) {
- .type = LANDLOCK_REQUEST_FS_ACCESS,
- .audit = {
- .type = LSM_AUDIT_DATA_IOCTL_OP,
- .u.op = &(struct lsm_ioctlop_audit) {
- .path = file->f_path,
- .cmd = cmd,
- },
- },
- ...
-
-As can be seen with the coming randstruct KUnit test, there appears to
-be no behavioral problems with this kind of initialization when the void
-member is removed from the randstruct GCC plugin, so remove it.
-
-Reported-by: "Dr. David Alan Gilbert" <linux@treblig.org>
-Closes: https://lore.kernel.org/lkml/Z_PRaKx7q70MKgCA@gallifrey/
-Reported-by: Mark Brown <broonie@kernel.org>
-Closes: https://lore.kernel.org/lkml/20250407-kbuild-disable-gcc-plugins-v1-1-5d46ae583f5e@kernel.org/
-Reported-by: WangYuli <wangyuli@uniontech.com>
-Closes: https://lore.kernel.org/lkml/337D5D4887277B27+3c677db3-a8b9-47f0-93a4-7809355f1381@uniontech.com/
-Fixes: 313dd1b62921 ("gcc-plugins: Add the randstruct plugin")
-Signed-off-by: Kees Cook <kees@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- scripts/gcc-plugins/randomize_layout_plugin.c | 18 +-----------------
- 1 file changed, 1 insertion(+), 17 deletions(-)
-
-diff --git a/scripts/gcc-plugins/randomize_layout_plugin.c b/scripts/gcc-plugins/randomize_layout_plugin.c
-index c7ff92b4189cb..a5aea51ecca99 100644
---- a/scripts/gcc-plugins/randomize_layout_plugin.c
-+++ b/scripts/gcc-plugins/randomize_layout_plugin.c
-@@ -377,29 +377,13 @@ static int relayout_struct(tree type)
-
- shuffle(type, (tree *)newtree, shuffle_length);
-
-- /*
-- * set up a bogus anonymous struct field designed to error out on unnamed struct initializers
-- * as gcc provides no other way to detect such code
-- */
-- list = make_node(FIELD_DECL);
-- TREE_CHAIN(list) = newtree[0];
-- TREE_TYPE(list) = void_type_node;
-- DECL_SIZE(list) = bitsize_zero_node;
-- DECL_NONADDRESSABLE_P(list) = 1;
-- DECL_FIELD_BIT_OFFSET(list) = bitsize_zero_node;
-- DECL_SIZE_UNIT(list) = size_zero_node;
-- DECL_FIELD_OFFSET(list) = size_zero_node;
-- DECL_CONTEXT(list) = type;
-- // to satisfy the constify plugin
-- TREE_READONLY(list) = 1;
--
- for (i = 0; i < num_fields - 1; i++)
- TREE_CHAIN(newtree[i]) = newtree[i+1];
- TREE_CHAIN(newtree[num_fields - 1]) = NULL_TREE;
-
- main_variant = TYPE_MAIN_VARIANT(type);
- for (variant = main_variant; variant; variant = TYPE_NEXT_VARIANT(variant)) {
-- TYPE_FIELDS(variant) = list;
-+ TYPE_FIELDS(variant) = newtree[0];
- TYPE_ATTRIBUTES(variant) = copy_list(TYPE_ATTRIBUTES(variant));
- TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("randomize_performed"), NULL_TREE, TYPE_ATTRIBUTES(variant));
- TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("designated_init"), NULL_TREE, TYPE_ATTRIBUTES(variant));
---
-2.39.5
-