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-w32-b7f88e01a4f590cd984860c693a9568e239ecdd1.tar.gz busybox-w32-b7f88e01a4f590cd984860c693a9568e239ecdd1.tar.bz2 busybox-w32-b7f88e01a4f590cd984860c693a9568e239ecdd1.zip |
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) | |||
100 | "mbn" | 100 | "mbn" |
101 | #endif | 101 | #endif |
102 | ); | 102 | ); |
103 | |||
104 | argc -= optind; | ||
105 | argv += optind; | ||
103 | if (mode & (BROADCAST | NETWORK | NETPREFIX)) { | 106 | if (mode & (BROADCAST | NETWORK | NETPREFIX)) { |
104 | if (argc - optind > 2) { | 107 | if (argc > 2 || argc <= 0) |
105 | bb_show_usage(); | 108 | bb_show_usage(); |
106 | } | ||
107 | } else { | 109 | } else { |
108 | if (argc - optind != 1) { | 110 | if (argc != 1) |
109 | bb_show_usage(); | 111 | bb_show_usage(); |
110 | } | ||
111 | } | 112 | } |
112 | 113 | ||
113 | #ifdef CONFIG_FEATURE_IPCALC_FANCY | 114 | #ifdef CONFIG_FEATURE_IPCALC_FANCY |
114 | prefixstr = ipstr = argv[optind]; | 115 | prefixstr = ipstr = argv[0]; |
115 | 116 | ||
116 | while(*prefixstr) { | 117 | while(*prefixstr) { |
117 | if (*prefixstr == '/') { | 118 | if (*prefixstr == '/') { |
@@ -142,16 +143,16 @@ int ipcalc_main(int argc, char **argv) | |||
142 | } | 143 | } |
143 | ipaddr = inet_aton(ipstr, &a); | 144 | ipaddr = inet_aton(ipstr, &a); |
144 | #else | 145 | #else |
145 | ipaddr = inet_aton(argv[optind], &a); | 146 | ipaddr = inet_aton(argv[0], &a); |
146 | #endif | 147 | #endif |
147 | 148 | ||
148 | if (ipaddr == 0) { | 149 | if (ipaddr == 0) { |
149 | IPCALC_MSG(bb_error_msg_and_die("bad IP address: %s", argv[optind]), | 150 | IPCALC_MSG(bb_error_msg_and_die("bad IP address: %s", argv[0]), |
150 | exit(EXIT_FAILURE)); | 151 | exit(EXIT_FAILURE)); |
151 | } | 152 | } |
152 | ipaddr = a.s_addr; | 153 | ipaddr = a.s_addr; |
153 | 154 | ||
154 | if (argc - optind == 2) { | 155 | if (argc == 2) { |
155 | #ifdef CONFIG_FEATURE_IPCALC_FANCY | 156 | #ifdef CONFIG_FEATURE_IPCALC_FANCY |
156 | if (have_netmask) { | 157 | if (have_netmask) { |
157 | IPCALC_MSG(bb_error_msg_and_die("Both prefix and netmask were specified, use one or the other.\n"), | 158 | 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) | |||
159 | } | 160 | } |
160 | 161 | ||
161 | #endif | 162 | #endif |
162 | netmask = inet_aton(argv[optind + 1], &a); | 163 | netmask = inet_aton(argv[1], &a); |
163 | if (netmask == 0) { | 164 | if (netmask == 0) { |
164 | IPCALC_MSG(bb_error_msg_and_die("bad netmask: %s", argv[optind + 1]), | 165 | IPCALC_MSG(bb_error_msg_and_die("bad netmask: %s", argv[1]), |
165 | exit(EXIT_FAILURE)); | 166 | exit(EXIT_FAILURE)); |
166 | } | 167 | } |
167 | netmask = a.s_addr; | 168 | netmask = a.s_addr; |
@@ -200,7 +201,7 @@ int ipcalc_main(int argc, char **argv) | |||
200 | hostinfo = gethostbyaddr((char *) &ipaddr, sizeof(ipaddr), AF_INET); | 201 | hostinfo = gethostbyaddr((char *) &ipaddr, sizeof(ipaddr), AF_INET); |
201 | if (!hostinfo) { | 202 | if (!hostinfo) { |
202 | IPCALC_MSG(bb_herror_msg_and_die( | 203 | IPCALC_MSG(bb_herror_msg_and_die( |
203 | "cannot find hostname for %s", argv[optind]),); | 204 | "cannot find hostname for %s", argv[0]),); |
204 | exit(EXIT_FAILURE); | 205 | exit(EXIT_FAILURE); |
205 | } | 206 | } |
206 | for (x = 0; hostinfo->h_name[x]; x++) { | 207 | for (x = 0; hostinfo->h_name[x]; x++) { |