lib/test_stackinit: Fix static initializer test
authorKees Cook <keescook@chromium.org>
Fri, 23 Jul 2021 22:19:31 +0000 (15:19 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 18 Sep 2021 11:40:37 +0000 (13:40 +0200)
commit f9398f15605a50110bf570aaa361163a85113dd1 upstream.

The static initializer test got accidentally converted to a dynamic
initializer. Fix this and retain the giant padding hole without using
an aligned struct member.

Fixes: 50ceaa95ea09 ("lib: Introduce test_stackinit module")
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: stable@vger.kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20210723221933.3431999-2-keescook@chromium.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
lib/test_stackinit.c

index f93b1e1..16b1d3a 100644 (file)
@@ -67,10 +67,10 @@ static bool range_contains(char *haystack_start, size_t haystack_size,
 #define INIT_STRUCT_none               /**/
 #define INIT_STRUCT_zero               = { }
 #define INIT_STRUCT_static_partial     = { .two = 0, }
-#define INIT_STRUCT_static_all         = { .one = arg->one,            \
-                                           .two = arg->two,            \
-                                           .three = arg->three,        \
-                                           .four = arg->four,          \
+#define INIT_STRUCT_static_all         = { .one = 0,                   \
+                                           .two = 0,                   \
+                                           .three = 0,                 \
+                                           .four = 0,                  \
                                        }
 #define INIT_STRUCT_dynamic_partial    = { .two = arg->two, }
 #define INIT_STRUCT_dynamic_all                = { .one = arg->one,            \
@@ -84,8 +84,7 @@ static bool range_contains(char *haystack_start, size_t haystack_size,
                                        var.one = 0;                    \
                                        var.two = 0;                    \
                                        var.three = 0;                  \
-                                       memset(&var.four, 0,            \
-                                              sizeof(var.four))
+                                       var.four = 0
 
 /*
  * @name: unique string name for the test
@@ -210,18 +209,13 @@ struct test_small_hole {
        unsigned long four;
 };
 
-/* Try to trigger unhandled padding in a structure. */
-struct test_aligned {
-       u32 internal1;
-       u64 internal2;
-} __aligned(64);
-
+/* Trigger unhandled padding in a structure. */
 struct test_big_hole {
        u8 one;
        u8 two;
        u8 three;
        /* 61 byte padding hole here. */
-       struct test_aligned four;
+       u8 four __aligned(64);
 } __aligned(64);
 
 struct test_trailing_hole {