s390/speculation: Use statically initialized const for instructions
authorKees Cook <keescook@chromium.org>
Wed, 16 Jun 2021 20:18:23 +0000 (13:18 -0700)
committerVasily Gorbik <gor@linux.ibm.com>
Mon, 28 Jun 2021 09:18:28 +0000 (11:18 +0200)
In preparation for FORTIFY_SOURCE performing compile-time and run-time
field bounds checking for memcpy(), memmove(), and memset(), avoid
confusing the checks when using a static const source.

Move the static const array into a variable so the compiler can perform
appropriate bounds checking.

Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20210616201823.1245603-1-keescook@chromium.org
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/kernel/nospec-branch.c

index 2c5c375..250e4db 100644 (file)
@@ -99,6 +99,7 @@ early_param("spectre_v2", spectre_v2_setup_early);
 static void __init_or_module __nospec_revert(s32 *start, s32 *end)
 {
        enum { BRCL_EXPOLINE, BRASL_EXPOLINE } type;
+       static const u8 branch[] = { 0x47, 0x00, 0x07, 0x00 };
        u8 *instr, *thunk, *br;
        u8 insnbuf[6];
        s32 *epo;
@@ -128,7 +129,7 @@ static void __init_or_module __nospec_revert(s32 *start, s32 *end)
                if ((br[0] & 0xbf) != 0x07 || (br[1] & 0xf0) != 0xf0)
                        continue;
 
-               memcpy(insnbuf + 2, (char[]) { 0x47, 0x00, 0x07, 0x00 }, 4);
+               memcpy(insnbuf + 2, branch, sizeof(branch));
                switch (type) {
                case BRCL_EXPOLINE:
                        insnbuf[0] = br[0];