From: Tony Ambardar <tony.ambardar@gmail.com>
To: Stephen Hemminger <stephen@networkplumber.org>,
David Ahern <dsahern@gmail.com>
Cc: Tony Ambardar <Tony.Ambardar@gmail.com>, netdev@vger.kernel.org
Subject: [PATCH iproute2 v2] ip: drop 2-char command assumption
Date: Tue, 20 Apr 2021 01:26:36 -0700 [thread overview]
Message-ID: <20210420082636.1210305-1-Tony.Ambardar@gmail.com> (raw)
In-Reply-To: <9008a711-be95-caf7-5c56-dad5450e8f5c@gmail.com>
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: 351efcde4e62 ("Update header files to 2.6.14")
Signed-off-by: Tony Ambardar <Tony.Ambardar@gmail.com>
---
v2: (feedback from David Ahern)
* work around problem but remain compatible with 2-char assumption
---
ip/ip.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/ip/ip.c b/ip/ip.c
index 4cf09fc3..8e4c6eb5 100644
--- a/ip/ip.c
+++ b/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)
@@ -313,11 +314,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();
--
2.25.1
next prev parent reply other threads:[~2021-04-20 8:27 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-18 3:49 [PATCH iproute2] ip: drop 2-char command assumption Tony Ambardar
2021-04-18 17:18 ` David Ahern
2021-04-20 8:26 ` Tony Ambardar [this message]
2021-04-20 15:16 ` [PATCH iproute2 v2] " Stephen Hemminger
2021-04-21 4:49 ` Tony Ambardar
2021-04-26 2:31 ` David Ahern
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210420082636.1210305-1-Tony.Ambardar@gmail.com \
--to=tony.ambardar@gmail.com \
--cc=dsahern@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=stephen@networkplumber.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).