s390/ipl: Fix size of vmcmd buffers for sending z/VM CP diag X'008' cmds
authorAlexander Egorenkov <egorenar@linux.ibm.com>
Fri, 10 May 2024 09:39:52 +0000 (11:39 +0200)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Tue, 14 May 2024 18:21:54 +0000 (20:21 +0200)
z/VM CP diagnose X'008' accepts commands of max 240 characters.
Using a smaller value as a buffer size makes kernel send truncated CP
commands which are longer than the old buffer size. This can result in
invalid CP commands passed to z/VM.

Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Egorenkov <egorenar@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/kernel/ipl.c

index 7dc54571f18eeacd496d89a0d004659341785741..eb3fd130ee81086f9e8c823dd4855dadcb29c116 100644 (file)
@@ -1958,11 +1958,13 @@ static struct shutdown_action __refdata dump_reipl_action = {
  * vmcmd shutdown action: Trigger vm command on shutdown.
  */
 
-static char vmcmd_on_reboot[128];
-static char vmcmd_on_panic[128];
-static char vmcmd_on_halt[128];
-static char vmcmd_on_poff[128];
-static char vmcmd_on_restart[128];
+#define VMCMD_MAX_SIZE 240
+
+static char vmcmd_on_reboot[VMCMD_MAX_SIZE + 1];
+static char vmcmd_on_panic[VMCMD_MAX_SIZE + 1];
+static char vmcmd_on_halt[VMCMD_MAX_SIZE + 1];
+static char vmcmd_on_poff[VMCMD_MAX_SIZE + 1];
+static char vmcmd_on_restart[VMCMD_MAX_SIZE + 1];
 
 DEFINE_IPL_ATTR_STR_RW(vmcmd, on_reboot, "%s\n", "%s\n", vmcmd_on_reboot);
 DEFINE_IPL_ATTR_STR_RW(vmcmd, on_panic, "%s\n", "%s\n", vmcmd_on_panic);
@@ -2288,8 +2290,8 @@ static int __init vmcmd_on_reboot_setup(char *str)
 {
        if (!MACHINE_IS_VM)
                return 1;
-       strncpy_skip_quote(vmcmd_on_reboot, str, 127);
-       vmcmd_on_reboot[127] = 0;
+       strncpy_skip_quote(vmcmd_on_reboot, str, VMCMD_MAX_SIZE);
+       vmcmd_on_reboot[VMCMD_MAX_SIZE] = 0;
        on_reboot_trigger.action = &vmcmd_action;
        return 1;
 }
@@ -2299,8 +2301,8 @@ static int __init vmcmd_on_panic_setup(char *str)
 {
        if (!MACHINE_IS_VM)
                return 1;
-       strncpy_skip_quote(vmcmd_on_panic, str, 127);
-       vmcmd_on_panic[127] = 0;
+       strncpy_skip_quote(vmcmd_on_panic, str, VMCMD_MAX_SIZE);
+       vmcmd_on_panic[VMCMD_MAX_SIZE] = 0;
        on_panic_trigger.action = &vmcmd_action;
        return 1;
 }
@@ -2310,8 +2312,8 @@ static int __init vmcmd_on_halt_setup(char *str)
 {
        if (!MACHINE_IS_VM)
                return 1;
-       strncpy_skip_quote(vmcmd_on_halt, str, 127);
-       vmcmd_on_halt[127] = 0;
+       strncpy_skip_quote(vmcmd_on_halt, str, VMCMD_MAX_SIZE);
+       vmcmd_on_halt[VMCMD_MAX_SIZE] = 0;
        on_halt_trigger.action = &vmcmd_action;
        return 1;
 }
@@ -2321,8 +2323,8 @@ static int __init vmcmd_on_poff_setup(char *str)
 {
        if (!MACHINE_IS_VM)
                return 1;
-       strncpy_skip_quote(vmcmd_on_poff, str, 127);
-       vmcmd_on_poff[127] = 0;
+       strncpy_skip_quote(vmcmd_on_poff, str, VMCMD_MAX_SIZE);
+       vmcmd_on_poff[VMCMD_MAX_SIZE] = 0;
        on_poff_trigger.action = &vmcmd_action;
        return 1;
 }