mirror of https://gitee.com/openkylin/linux.git
x86/corruption-check: Fix panic in memory_corruption_check() when boot option without value is provided
memory_corruption_check[{_period|_size}]()'s handlers do not check input argument before passing it to kstrtoul() or simple_strtoull(). The argument would be a NULL pointer if each of the kernel parameters, without its value, is set in command line and thus cause the following panic. PANIC: early exception 0xe3 IP 10:ffffffff73587c22 error 0 cr2 0x0 [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 4.18-rc8+ #2 [ 0.000000] RIP: 0010:kstrtoull+0x2/0x10 ... [ 0.000000] Call Trace [ 0.000000] ? set_corruption_check+0x21/0x49 [ 0.000000] ? do_early_param+0x4d/0x82 [ 0.000000] ? parse_args+0x212/0x330 [ 0.000000] ? rdinit_setup+0x26/0x26 [ 0.000000] ? parse_early_options+0x20/0x23 [ 0.000000] ? rdinit_setup+0x26/0x26 [ 0.000000] ? parse_early_param+0x2d/0x39 [ 0.000000] ? setup_arch+0x2f7/0xbf4 [ 0.000000] ? start_kernel+0x5e/0x4c2 [ 0.000000] ? load_ucode_bsp+0x113/0x12f [ 0.000000] ? secondary_startup_64+0xa5/0xb0 This patch adds checks to prevent the panic. Signed-off-by: He Zhe <zhe.he@windriver.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: gregkh@linuxfoundation.org Cc: kstewart@linuxfoundation.org Cc: pombredanne@nexb.com Cc: stable@vger.kernel.org Link: http://lkml.kernel.org/r/1534260823-87917-1-git-send-email-zhe.he@windriver.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
11da3a7f84
commit
ccde460b9a
|
@ -31,6 +31,11 @@ static __init int set_corruption_check(char *arg)
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
|
|
||||||
|
if (!arg) {
|
||||||
|
pr_err("memory_corruption_check config string not provided\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
ret = kstrtoul(arg, 10, &val);
|
ret = kstrtoul(arg, 10, &val);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -45,6 +50,11 @@ static __init int set_corruption_check_period(char *arg)
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
|
|
||||||
|
if (!arg) {
|
||||||
|
pr_err("memory_corruption_check_period config string not provided\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
ret = kstrtoul(arg, 10, &val);
|
ret = kstrtoul(arg, 10, &val);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -59,6 +69,11 @@ static __init int set_corruption_check_size(char *arg)
|
||||||
char *end;
|
char *end;
|
||||||
unsigned size;
|
unsigned size;
|
||||||
|
|
||||||
|
if (!arg) {
|
||||||
|
pr_err("memory_corruption_check_size config string not provided\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
size = memparse(arg, &end);
|
size = memparse(arg, &end);
|
||||||
|
|
||||||
if (*end == '\0')
|
if (*end == '\0')
|
||||||
|
|
Loading…
Reference in New Issue