Skip to content

Commit 0ea0908

Browse files
andy-shevbrgl
authored andcommitted
lib/cmdline: Allow get_options() to take 0 to validate the input
Allow get_options() to take 0 as a number of integers parameter to validate the input. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
1 parent f1f405c commit 0ea0908

2 files changed

Lines changed: 21 additions & 4 deletions

File tree

lib/cmdline.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ EXPORT_SYMBOL(get_option);
9191
* full, or when no more numbers can be retrieved from the
9292
* string.
9393
*
94+
* When @nints is 0, the function just validates the given @str and
95+
* returns the amount of parseable integers as described below.
96+
*
9497
* Returns:
9598
*
9699
* The first element is filled by the number of collected integers
@@ -103,15 +106,20 @@ EXPORT_SYMBOL(get_option);
103106

104107
char *get_options(const char *str, int nints, int *ints)
105108
{
109+
bool validate = (nints == 0);
106110
int res, i = 1;
107111

108-
while (i < nints) {
109-
res = get_option((char **)&str, ints + i);
112+
while (i < nints || validate) {
113+
int *pint = validate ? ints : ints + i;
114+
115+
res = get_option((char **)&str, pint);
110116
if (res == 0)
111117
break;
112118
if (res == 3) {
119+
int n = validate ? 0 : nints - i;
113120
int range_nums;
114-
range_nums = get_range((char **)&str, ints + i, nints - i);
121+
122+
range_nums = get_range((char **)&str, pint, n);
115123
if (range_nums < 0)
116124
break;
117125
/*

lib/cmdline_kunit.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,22 @@ static void cmdline_do_one_range_test(struct kunit *test, const char *in,
109109
{
110110
unsigned int i;
111111
int r[16];
112+
int *p;
112113

113114
memset(r, 0, sizeof(r));
114115
get_options(in, ARRAY_SIZE(r), r);
115-
KUNIT_EXPECT_EQ_MSG(test, r[0], e[0], "in test %u expected %d numbers, got %d",
116+
KUNIT_EXPECT_EQ_MSG(test, r[0], e[0], "in test %u (parsed) expected %d numbers, got %d",
116117
n, e[0], r[0]);
117118
for (i = 1; i < ARRAY_SIZE(r); i++)
118119
KUNIT_EXPECT_EQ_MSG(test, r[i], e[i], "in test %u at %u", n, i);
120+
121+
memset(r, 0, sizeof(r));
122+
get_options(in, 0, r);
123+
KUNIT_EXPECT_EQ_MSG(test, r[0], e[0], "in test %u (validated) expected %d numbers, got %d",
124+
n, e[0], r[0]);
125+
126+
p = memchr_inv(&r[1], 0, sizeof(r) - sizeof(r[0]));
127+
KUNIT_EXPECT_PTR_EQ_MSG(test, p, (int *)0, "in test %u at %u out of bound", n, p - r);
119128
}
120129

121130
static void cmdline_test_range(struct kunit *test)

0 commit comments

Comments
 (0)