]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
lib/tests: extend cmdline KUnit with next_arg() tests
authorShuvam Pandey <shuvampandey1@gmail.com>
Mon, 16 Mar 2026 10:12:27 +0000 (15:57 +0545)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 29 May 2026 04:24:49 +0000 (21:24 -0700)
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
9847f21225c4 ("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>
lib/tests/cmdline_kunit.c

index c1602f797637b7e94803aa4bc7fc28f51e1658b7..af44ae9e92c3e7bcb9535ce38e2896380a2d53de 100644 (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),
        {}
 };