diff options
author | Mike Frysinger <vapier@gentoo.org> | 2005-09-24 23:48:18 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2005-09-24 23:48:18 +0000 |
commit | b7f88e01a4f590cd984860c693a9568e239ecdd1 (patch) | |
tree | 25c089dea90dbb522bd0ef68c743bcc653f2e8bd | |
parent | a630cb15b114ec3caa661c05ecbe993342c2be9f (diff) | |
download | busybox-b7f88e01a4f590cd984860c693a9568e239ecdd1.tar.gz |
touchup argc/argv handling to shrink a bit and fix a segfault when given wrong number of parameters as noted and fixed by Cristian Ionescu-Idbohrn
-rw-r--r-- | networking/ipcalc.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/networking/ipcalc.c b/networking/ipcalc.c index bcd272b85..c5f2ba121 100644 --- a/networking/ipcalc.c +++ b/networking/ipcalc.c @@ -100,18 +100,19 @@ int ipcalc_main(int argc, char **argv) "mbn" #endif ); + + argc -= optind; + argv += optind; if (mode & (BROADCAST | NETWORK | NETPREFIX)) { - if (argc - optind > 2) { + if (argc > 2 || argc <= 0) bb_show_usage(); - } } else { - if (argc - optind != 1) { + if (argc != 1) bb_show_usage(); - } } #ifdef CONFIG_FEATURE_IPCALC_FANCY - prefixstr = ipstr = argv[optind]; + prefixstr = ipstr = argv[0]; while(*prefixstr) { if (*prefixstr == '/') { @@ -142,16 +143,16 @@ int ipcalc_main(int argc, char **argv) } ipaddr = inet_aton(ipstr, &a); #else - ipaddr = inet_aton(argv[optind], &a); + ipaddr = inet_aton(argv[0], &a); #endif if (ipaddr == 0) { - IPCALC_MSG(bb_error_msg_and_die("bad IP address: %s", argv[optind]), + IPCALC_MSG(bb_error_msg_and_die("bad IP address: %s", argv[0]), exit(EXIT_FAILURE)); } ipaddr = a.s_addr; - if (argc - optind == 2) { + if (argc == 2) { #ifdef CONFIG_FEATURE_IPCALC_FANCY if (have_netmask) { IPCALC_MSG(bb_error_msg_and_die("Both prefix and netmask were specified, use one or the other.\n"), @@ -159,9 +160,9 @@ int ipcalc_main(int argc, char **argv) } #endif - netmask = inet_aton(argv[optind + 1], &a); + netmask = inet_aton(argv[1], &a); if (netmask == 0) { - IPCALC_MSG(bb_error_msg_and_die("bad netmask: %s", argv[optind + 1]), + IPCALC_MSG(bb_error_msg_and_die("bad netmask: %s", argv[1]), exit(EXIT_FAILURE)); } netmask = a.s_addr; @@ -200,7 +201,7 @@ int ipcalc_main(int argc, char **argv) hostinfo = gethostbyaddr((char *) &ipaddr, sizeof(ipaddr), AF_INET); if (!hostinfo) { IPCALC_MSG(bb_herror_msg_and_die( - "cannot find hostname for %s", argv[optind]),); + "cannot find hostname for %s", argv[0]),); exit(EXIT_FAILURE); } for (x = 0; hostinfo->h_name[x]; x++) { |