summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>2020-12-16 05:43:27 +0100
committerLinus Torvalds <torvalds@linux-foundation.org>2020-12-16 07:46:16 +0100
commite291851d65495739e4eede33b6bc387bb546a19b (patch)
tree3d9badab89dc17588db8c10a6d811093f08e4a8b
parentlib/test_lockup.c: minimum fix to get it compiled on PREEMPT_RT (diff)
downloadlinux-e291851d65495739e4eede33b6bc387bb546a19b.tar.xz
linux-e291851d65495739e4eede33b6bc387bb546a19b.zip
lib/cmdline: fix get_option() for strings starting with hyphen
When string doesn't have an integer and starts from hyphen get_option() may return interesting results. Fix it to return 0. The simple_strtoull() is used due to absence of simple_strtoul() in a boot code on some architectures. Note, the Fixes tag below is rather for anthropological curiosity. Link: https://lkml.kernel.org/r/20201112180732.75589-4-andriy.shevchenko@linux.intel.com Fixes: f68565831e72 ("Import 2.4.0-test2pre3") Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: Brendan Higgins <brendanhiggins@google.com> Cc: David Gow <davidgow@google.com> Cc: Mark Brown <broonie@kernel.org> Cc: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com> Cc: Shuah Khan <skhan@linuxfoundation.org> Cc: Vitor Massaru Iha <vitor@massaru.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--lib/cmdline.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/lib/cmdline.c b/lib/cmdline.c
index fbb9981a04a4..ca89846ee0bb 100644
--- a/lib/cmdline.c
+++ b/lib/cmdline.c
@@ -45,6 +45,9 @@ static int get_range(char **str, int *pint, int n)
* 1 - int found, no subsequent comma
* 2 - int found including a subsequent comma
* 3 - hyphen found to denote a range
+ *
+ * Leading hyphen without integer is no integer case, but we consume it
+ * for the sake of simplification.
*/
int get_option(char **str, int *pint)
@@ -53,7 +56,10 @@ int get_option(char **str, int *pint)
if (!cur || !(*cur))
return 0;
- *pint = simple_strtol(cur, str, 0);
+ if (*cur == '-')
+ *pint = -simple_strtoull(++cur, str, 0);
+ else
+ *pint = simple_strtoull(cur, str, 0);
if (cur == *str)
return 0;
if (**str == ',') {