mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-22 13:02:44 +01:00
client: Fix parsing commands with no "entity" part
The code would assume that a command with argc >= 3 would always be composed of <family name> <entity> <command> and thus "known-networks forget <ssid>" could not be executed. Instead of checking argc >= 3 check whether command->entity is non-NULL.
This commit is contained in:
parent
18e672fa2f
commit
15ade259e6
@ -367,20 +367,38 @@ error:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool match_cmd(const char *family, const char *entity, const char *cmd,
|
static bool match_cmd(const char *family, const char *param,
|
||||||
char **argv, int argc,
|
char **argv, int argc,
|
||||||
const struct command *command_list)
|
const struct command *command_list)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 0; command_list[i].cmd; i++) {
|
for (i = 0; command_list[i].cmd; i++) {
|
||||||
|
const char *entity;
|
||||||
|
const char *cmd;
|
||||||
|
int offset;
|
||||||
|
|
||||||
|
if (command_list[i].entity) {
|
||||||
|
if (argc < 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
entity = param;
|
||||||
|
cmd = argv[0];
|
||||||
|
offset = 1;
|
||||||
|
} else {
|
||||||
|
entity = NULL;
|
||||||
|
cmd = param;
|
||||||
|
offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (strcmp(command_list[i].cmd, cmd))
|
if (strcmp(command_list[i].cmd, cmd))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!command_list[i].function)
|
if (!command_list[i].function)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
execute_cmd(family, entity, &command_list[i], argv, argc);
|
execute_cmd(family, entity, &command_list[i],
|
||||||
|
argv + offset, argc - offset);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -402,14 +420,8 @@ static bool match_cmd_family(char **argv, int argc)
|
|||||||
if (strcmp(family->name, argv[0]))
|
if (strcmp(family->name, argv[0]))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (argc >= 3)
|
return match_cmd(family->name, argv[1], argv + 2, argc - 2,
|
||||||
return match_cmd(family->name, argv[1], argv[2],
|
family->command_list);
|
||||||
argv + 3, argc - 3,
|
|
||||||
family->command_list);
|
|
||||||
else
|
|
||||||
return match_cmd(family->name, NULL, argv[1],
|
|
||||||
argv + 2, argc - 2,
|
|
||||||
family->command_list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -451,7 +463,7 @@ void command_process_prompt(char **argv, int argc)
|
|||||||
|
|
||||||
display_refresh_reset();
|
display_refresh_reset();
|
||||||
|
|
||||||
if (match_cmd(NULL, NULL, argv[0], argv + 1, argc - 1, command_list))
|
if (match_cmd(NULL, argv[0], argv + 1, argc - 1, command_list))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (strcmp(argv[0], "help")) {
|
if (strcmp(argv[0], "help")) {
|
||||||
|
Loading…
Reference in New Issue
Block a user