mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-25 05:04:23 +08:00
bootstd: Handle a few special cases in cmdline_set_arg()
Two bugs have appeared: - arguments can have an equals sign embedded in them, which must be considered part of the value - arguments must fully match the name; partial matches should be ignored Fix these and add a test to cover both. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
f2bfa0cb17
commit
19248dcec5
@ -752,7 +752,7 @@ int cmdline_set_arg(char *buf, int maxlen, const char *cmdline,
|
|||||||
in_quote = false;
|
in_quote = false;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (*p == '=') {
|
if (*p == '=' && !arg_end) {
|
||||||
arg_end = p;
|
arg_end = p;
|
||||||
val = p + 1;
|
val = p + 1;
|
||||||
} else if (*p == '"') {
|
} else if (*p == '"') {
|
||||||
@ -788,7 +788,8 @@ int cmdline_set_arg(char *buf, int maxlen, const char *cmdline,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* if this is the target arg, update it */
|
/* if this is the target arg, update it */
|
||||||
if (!strncmp(from, set_arg, arg_end - from)) {
|
if (arg_end - from == set_arg_len &&
|
||||||
|
!strncmp(from, set_arg, set_arg_len)) {
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
bool has_quote = val_end[-1] == '"';
|
bool has_quote = val_end[-1] == '"';
|
||||||
|
|
||||||
|
@ -973,6 +973,26 @@ static int bootflow_cmdline(struct unit_test_state *uts)
|
|||||||
}
|
}
|
||||||
BOOTSTD_TEST(bootflow_cmdline, 0);
|
BOOTSTD_TEST(bootflow_cmdline, 0);
|
||||||
|
|
||||||
|
/* test a few special changes to a long command line */
|
||||||
|
static int bootflow_cmdline_special(struct unit_test_state *uts)
|
||||||
|
{
|
||||||
|
char buf[500];
|
||||||
|
int pos;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check handling of an argument which has an embedded '=', as well as
|
||||||
|
* handling of a argument which partially matches ("ro" and "root")
|
||||||
|
*/
|
||||||
|
ut_asserteq(32, cmdline_set_arg(
|
||||||
|
buf, sizeof(buf),
|
||||||
|
"loglevel=7 root=PARTUUID=d68352e3 rootwait ro noinitrd",
|
||||||
|
"root", NULL, &pos));
|
||||||
|
ut_asserteq_str("loglevel=7 rootwait ro noinitrd", buf);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
BOOTSTD_TEST(bootflow_cmdline_special, 0);
|
||||||
|
|
||||||
/* Test ChromiumOS bootmeth */
|
/* Test ChromiumOS bootmeth */
|
||||||
static int bootflow_cros(struct unit_test_state *uts)
|
static int bootflow_cros(struct unit_test_state *uts)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user