ip: drop 2-char command assumption
The 'ip' utility hardcodes the assumption of being a 2-char command, where
any follow-on characters are passed as an argument:
$ ./ip-full help
Object "-full" is unknown, try "ip help".
This confusing behaviour isn't seen with 'tc' for example, and was added in
a 2005 commit without documentation. It was noticed during testing of 'ip'
variants built/packaged with different feature sets (e.g. w/o BPF support).
Mitigate the problem by redoing the command without the 2-char assumption
if the follow-on characters fail to parse as a valid command.
Fixes: 351efcde4e ("Update header files to 2.6.14")
Signed-off-by: Tony Ambardar <Tony.Ambardar@gmail.com>
Signed-off-by: David Ahern <dsahern@kernel.org>
This commit is contained in:
parent
81bfd01a4c
commit
e705b19d48
16
ip/ip.c
16
ip/ip.c
|
|
@ -125,7 +125,7 @@ static const struct cmd {
|
|||
{ 0 }
|
||||
};
|
||||
|
||||
static int do_cmd(const char *argv0, int argc, char **argv)
|
||||
static int do_cmd(const char *argv0, int argc, char **argv, bool final)
|
||||
{
|
||||
const struct cmd *c;
|
||||
|
||||
|
|
@ -134,7 +134,8 @@ static int do_cmd(const char *argv0, int argc, char **argv)
|
|||
return -(c->func(argc-1, argv+1));
|
||||
}
|
||||
|
||||
fprintf(stderr, "Object \"%s\" is unknown, try \"ip help\".\n", argv0);
|
||||
if (final)
|
||||
fprintf(stderr, "Object \"%s\" is unknown, try \"ip help\".\n", argv0);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
|
@ -143,7 +144,7 @@ static int ip_batch_cmd(int argc, char *argv[], void *data)
|
|||
const int *orig_family = data;
|
||||
|
||||
preferred_family = *orig_family;
|
||||
return do_cmd(argv[0], argc, argv);
|
||||
return do_cmd(argv[0], argc, argv, true);
|
||||
}
|
||||
|
||||
static int batch(const char *name)
|
||||
|
|
@ -312,11 +313,14 @@ int main(int argc, char **argv)
|
|||
|
||||
rtnl_set_strict_dump(&rth);
|
||||
|
||||
if (strlen(basename) > 2)
|
||||
return do_cmd(basename+2, argc, argv);
|
||||
if (strlen(basename) > 2) {
|
||||
int ret = do_cmd(basename+2, argc, argv, false);
|
||||
if (ret != EXIT_FAILURE)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (argc > 1)
|
||||
return do_cmd(argv[1], argc-1, argv+1);
|
||||
return do_cmd(argv[1], argc-1, argv+1, true);
|
||||
|
||||
rtnl_close(&rth);
|
||||
usage();
|
||||
|
|
|
|||
Loading…
Reference in New Issue