aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2005-09-24 23:48:18 +0000
committerMike Frysinger <vapier@gentoo.org>2005-09-24 23:48:18 +0000
commitb7f88e01a4f590cd984860c693a9568e239ecdd1 (patch)
tree25c089dea90dbb522bd0ef68c743bcc653f2e8bd
parenta630cb15b114ec3caa661c05ecbe993342c2be9f (diff)
downloadbusybox-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.c23
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++) {