lib/tests: extend cmdline KUnit with next_arg() tests

The cmdline KUnit suite covers get_option() and get_options(), but it
does not exercise next_arg().

Extend the suite with one test for a quoted value containing spaces and
one regression test for a bare quote token after a normal parameter.

The regression test covers the bare quote token path fixed by commit
9847f21225 ("lib/cmdline: avoid page fault in next_arg").

[shuvampandey1@gmail.com: extend cmdline next_arg() coverage with mixed tokens]
  Link: https://lore.kernel.org/20260316211249.88601-1-shuvampandey1@gmail.com
Link: https://lore.kernel.org/20260316101227.15807-1-shuvampandey1@gmail.com
Signed-off-by: Shuvam Pandey <shuvampandey1@gmail.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Cc: Neel Natu <neelnatu@google.com>
Cc: Dmitry Antipov <dmantipov@yandex.ru>
Cc: "Darrick J. Wong" <djwong@kernel.org>
Cc: Kees Cook <kees@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Shuvam Pandey 2026-03-16 15:57:27 +05:45 committed by Andrew Morton
parent 2f5026b8d4
commit dcc8a57815

View File

@ -139,11 +139,73 @@ static void cmdline_test_range(struct kunit *test)
} while (++i < ARRAY_SIZE(cmdline_test_range_strings));
}
static void cmdline_test_next_arg_quoted_value(struct kunit *test)
{
char in[] = "foo=\"bar baz\" qux=1";
char *next, *param, *val;
next = next_arg(in, &param, &val);
KUNIT_EXPECT_STREQ(test, param, "foo");
KUNIT_ASSERT_NOT_NULL(test, val);
KUNIT_EXPECT_STREQ(test, val, "bar baz");
KUNIT_EXPECT_STREQ(test, next, "qux=1");
next = next_arg(next, &param, &val);
KUNIT_EXPECT_STREQ(test, param, "qux");
KUNIT_ASSERT_NOT_NULL(test, val);
KUNIT_EXPECT_STREQ(test, val, "1");
KUNIT_EXPECT_STREQ(test, next, "");
}
static void cmdline_test_next_arg_bare_quote_regression(struct kunit *test)
{
char in[] = "foo=bar \"";
char *next, *param, *val;
next = next_arg(in, &param, &val);
KUNIT_EXPECT_STREQ(test, param, "foo");
KUNIT_ASSERT_NOT_NULL(test, val);
KUNIT_EXPECT_STREQ(test, val, "bar");
KUNIT_EXPECT_STREQ(test, next, "\"");
/* This hits the i == 0 quoted-token case fixed by 9847f21225c4. */
next = next_arg(next, &param, &val);
KUNIT_EXPECT_STREQ(test, param, "");
KUNIT_EXPECT_PTR_EQ(test, val, NULL);
KUNIT_EXPECT_STREQ(test, next, "");
}
static void cmdline_test_next_arg_mixed_tokens(struct kunit *test)
{
char in[] = "bbb= jjj kkk=\"a=b\"";
char *next, *param, *val;
next = next_arg(in, &param, &val);
KUNIT_EXPECT_STREQ(test, param, "bbb");
KUNIT_ASSERT_NOT_NULL(test, val);
KUNIT_EXPECT_STREQ(test, val, "");
KUNIT_EXPECT_STREQ(test, next, "jjj kkk=\"a=b\"");
next = next_arg(next, &param, &val);
KUNIT_EXPECT_STREQ(test, param, "jjj");
KUNIT_EXPECT_NULL(test, val);
KUNIT_EXPECT_STREQ(test, next, "kkk=\"a=b\"");
next = next_arg(next, &param, &val);
KUNIT_EXPECT_STREQ(test, param, "kkk");
KUNIT_ASSERT_NOT_NULL(test, val);
KUNIT_EXPECT_STREQ(test, val, "a=b");
KUNIT_EXPECT_STREQ(test, next, "");
}
static struct kunit_case cmdline_test_cases[] = {
KUNIT_CASE(cmdline_test_noint),
KUNIT_CASE(cmdline_test_lead_int),
KUNIT_CASE(cmdline_test_tail_int),
KUNIT_CASE(cmdline_test_range),
KUNIT_CASE(cmdline_test_next_arg_quoted_value),
KUNIT_CASE(cmdline_test_next_arg_bare_quote_regression),
KUNIT_CASE(cmdline_test_next_arg_mixed_tokens),
{}
};