aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2009-04-21 23:48:38 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2009-04-21 23:48:38 +0000
commita771e7c0057d0f506f8cdf67be39268e1c9f0735 (patch)
treebef7afb1304b3510d4857148a50e162a0578c363
parente6b10ef0a7a5761c4cd0fe5f48bad953aa92240e (diff)
downloadbusybox-w32-a771e7c0057d0f506f8cdf67be39268e1c9f0735.tar.gz
busybox-w32-a771e7c0057d0f506f8cdf67be39268e1c9f0735.tar.bz2
busybox-w32-a771e7c0057d0f506f8cdf67be39268e1c9f0735.zip
*: remove check for errors on getsockaddr in cases we know they can't happen
libbb: make get_sock_lsa use only one getsockaddr syscall, not two function old new delta get_sock_lsa 72 101 +29 do_iplink 1151 1137 -14 arping_main 1585 1569 -16 dolisten 789 755 -34 xrtnl_open 161 94 -67
-rw-r--r--libbb/xconnect.c21
-rw-r--r--networking/arping.c15
-rw-r--r--networking/libiproute/iplink.c8
-rw-r--r--networking/libiproute/libnetlink.c9
-rw-r--r--networking/libiproute/libnetlink.h3
-rw-r--r--networking/nc_bloaty.c12
6 files changed, 37 insertions, 31 deletions
diff --git a/libbb/xconnect.c b/libbb/xconnect.c
index 1b4f4f78a..f853e9593 100644
--- a/libbb/xconnect.c
+++ b/libbb/xconnect.c
@@ -37,16 +37,21 @@ int FAST_FUNC setsockopt_bindtodevice(int fd, const char *iface)
37 37
38len_and_sockaddr* FAST_FUNC get_sock_lsa(int fd) 38len_and_sockaddr* FAST_FUNC get_sock_lsa(int fd)
39{ 39{
40 len_and_sockaddr *lsa; 40 len_and_sockaddr lsa;
41 socklen_t len = 0; 41 len_and_sockaddr *lsa_ptr;
42 42
43 /* Can be optimized to do only one getsockname() */ 43 lsa.len = LSA_SIZEOF_SA;
44 if (getsockname(fd, NULL, &len) != 0) 44 if (getsockname(fd, &lsa.u.sa, &lsa.len) != 0)
45 return NULL; 45 return NULL;
46 lsa = xzalloc(LSA_LEN_SIZE + len); 46
47 lsa->len = len; 47 lsa_ptr = xzalloc(LSA_LEN_SIZE + lsa.len);
48 getsockname(fd, &lsa->u.sa, &lsa->len); 48 if (lsa.len > LSA_SIZEOF_SA) { /* rarely (if ever) happens */
49 return lsa; 49 lsa_ptr->len = lsa.len;
50 getsockname(fd, &lsa_ptr->u.sa, &lsa_ptr->len);
51 } else {
52 memcpy(lsa_ptr, &lsa, LSA_LEN_SIZE + lsa.len);
53 }
54 return lsa_ptr;
50} 55}
51 56
52void FAST_FUNC xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen) 57void FAST_FUNC xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen)
diff --git a/networking/arping.c b/networking/arping.c
index 915af3261..ab39c717b 100644
--- a/networking/arping.c
+++ b/networking/arping.c
@@ -348,9 +348,10 @@ int arping_main(int argc UNUSED_PARAM, char **argv)
348 if (setsockopt(probe_fd, SOL_SOCKET, SO_DONTROUTE, &const_int_1, sizeof(const_int_1)) == -1) 348 if (setsockopt(probe_fd, SOL_SOCKET, SO_DONTROUTE, &const_int_1, sizeof(const_int_1)) == -1)
349 bb_perror_msg("setsockopt(SO_DONTROUTE)"); 349 bb_perror_msg("setsockopt(SO_DONTROUTE)");
350 xconnect(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)); 350 xconnect(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr));
351 if (getsockname(probe_fd, (struct sockaddr *) &saddr, &alen) == -1) { 351 getsockname(probe_fd, (struct sockaddr *) &saddr, &alen);
352 bb_perror_msg_and_die("getsockname"); 352 //never happens:
353 } 353 //if (getsockname(probe_fd, (struct sockaddr *) &saddr, &alen) == -1)
354 // bb_perror_msg_and_die("getsockname");
354 if (saddr.sin_family != AF_INET) 355 if (saddr.sin_family != AF_INET)
355 bb_error_msg_and_die("no IP address configured"); 356 bb_error_msg_and_die("no IP address configured");
356 src = saddr.sin_addr; 357 src = saddr.sin_addr;
@@ -365,10 +366,10 @@ int arping_main(int argc UNUSED_PARAM, char **argv)
365 366
366 { 367 {
367 socklen_t alen = sizeof(me); 368 socklen_t alen = sizeof(me);
368 369 getsockname(sock_fd, (struct sockaddr *) &me, &alen);
369 if (getsockname(sock_fd, (struct sockaddr *) &me, &alen) == -1) { 370 //never happens:
370 bb_perror_msg_and_die("getsockname"); 371 //if (getsockname(sock_fd, (struct sockaddr *) &me, &alen) == -1)
371 } 372 // bb_perror_msg_and_die("getsockname");
372 } 373 }
373 if (me.sll_halen == 0) { 374 if (me.sll_halen == 0) {
374 bb_error_msg(err_str, "is not ARPable (no ll address)"); 375 bb_error_msg(err_str, "is not ARPable (no ll address)");
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c
index 1e7ee07d2..de7d6407e 100644
--- a/networking/libiproute/iplink.c
+++ b/networking/libiproute/iplink.c
@@ -112,11 +112,11 @@ static int get_address(char *dev, int *htype)
112 me.sll_ifindex = ifr.ifr_ifindex; 112 me.sll_ifindex = ifr.ifr_ifindex;
113 me.sll_protocol = htons(ETH_P_LOOP); 113 me.sll_protocol = htons(ETH_P_LOOP);
114 xbind(s, (struct sockaddr*)&me, sizeof(me)); 114 xbind(s, (struct sockaddr*)&me, sizeof(me));
115
116 alen = sizeof(me); 115 alen = sizeof(me);
117 if (getsockname(s, (struct sockaddr*)&me, &alen) == -1) { 116 getsockname(s, (struct sockaddr*)&me, &alen);
118 bb_perror_msg_and_die("getsockname"); 117 //never happens:
119 } 118 //if (getsockname(s, (struct sockaddr*)&me, &alen) == -1)
119 // bb_perror_msg_and_die("getsockname");
120 close(s); 120 close(s);
121 *htype = me.sll_hatype; 121 *htype = me.sll_hatype;
122 return me.sll_halen; 122 return me.sll_halen;
diff --git a/networking/libiproute/libnetlink.c b/networking/libiproute/libnetlink.c
index 6d51d8deb..7ad2de9fa 100644
--- a/networking/libiproute/libnetlink.c
+++ b/networking/libiproute/libnetlink.c
@@ -26,22 +26,23 @@ int FAST_FUNC xrtnl_open(struct rtnl_handle *rth/*, unsigned subscriptions*/)
26{ 26{
27 socklen_t addr_len; 27 socklen_t addr_len;
28 28
29 memset(rth, 0, sizeof(rth)); 29 memset(rth, 0, sizeof(*rth));
30
31 rth->fd = xsocket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); 30 rth->fd = xsocket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
32
33 memset(&rth->local, 0, sizeof(rth->local));
34 rth->local.nl_family = AF_NETLINK; 31 rth->local.nl_family = AF_NETLINK;
35 /*rth->local.nl_groups = subscriptions;*/ 32 /*rth->local.nl_groups = subscriptions;*/
36 33
37 xbind(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local)); 34 xbind(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local));
38 addr_len = sizeof(rth->local); 35 addr_len = sizeof(rth->local);
36 getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len);
37
38/* too much paranoia
39 if (getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len) < 0) 39 if (getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len) < 0)
40 bb_perror_msg_and_die("getsockname"); 40 bb_perror_msg_and_die("getsockname");
41 if (addr_len != sizeof(rth->local)) 41 if (addr_len != sizeof(rth->local))
42 bb_error_msg_and_die("wrong address length %d", addr_len); 42 bb_error_msg_and_die("wrong address length %d", addr_len);
43 if (rth->local.nl_family != AF_NETLINK) 43 if (rth->local.nl_family != AF_NETLINK)
44 bb_error_msg_and_die("wrong address family %d", rth->local.nl_family); 44 bb_error_msg_and_die("wrong address family %d", rth->local.nl_family);
45*/
45 rth->seq = time(NULL); 46 rth->seq = time(NULL);
46 return 0; 47 return 0;
47} 48}
diff --git a/networking/libiproute/libnetlink.h b/networking/libiproute/libnetlink.h
index e5fee4dd8..11a4a100a 100644
--- a/networking/libiproute/libnetlink.h
+++ b/networking/libiproute/libnetlink.h
@@ -10,8 +10,7 @@
10 10
11PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN 11PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
12 12
13struct rtnl_handle 13struct rtnl_handle {
14{
15 int fd; 14 int fd;
16 struct sockaddr_nl local; 15 struct sockaddr_nl local;
17 struct sockaddr_nl peer; 16 struct sockaddr_nl peer;
diff --git a/networking/nc_bloaty.c b/networking/nc_bloaty.c
index 47940e9b3..efe831ec3 100644
--- a/networking/nc_bloaty.c
+++ b/networking/nc_bloaty.c
@@ -278,9 +278,9 @@ static void dolisten(void)
278 random unknown port is probably not very useful without "netstat". */ 278 random unknown port is probably not very useful without "netstat". */
279 if (o_verbose) { 279 if (o_verbose) {
280 char *addr; 280 char *addr;
281 rr = getsockname(netfd, &ouraddr->u.sa, &ouraddr->len); 281 getsockname(netfd, &ouraddr->u.sa, &ouraddr->len);
282 if (rr < 0) 282 //if (rr < 0)
283 bb_perror_msg_and_die("getsockname after bind"); 283 // bb_perror_msg_and_die("getsockname after bind");
284 addr = xmalloc_sockaddr2dotted(&ouraddr->u.sa); 284 addr = xmalloc_sockaddr2dotted(&ouraddr->u.sa);
285 fprintf(stderr, "listening on %s ...\n", addr); 285 fprintf(stderr, "listening on %s ...\n", addr);
286 free(addr); 286 free(addr);
@@ -359,9 +359,9 @@ create new one, and bind() it. TODO */
359 doing a listen-on-any on a multihomed machine. This allows one to 359 doing a listen-on-any on a multihomed machine. This allows one to
360 offer different services via different alias addresses, such as the 360 offer different services via different alias addresses, such as the
361 "virtual web site" hack. */ 361 "virtual web site" hack. */
362 rr = getsockname(netfd, &ouraddr->u.sa, &ouraddr->len); 362 getsockname(netfd, &ouraddr->u.sa, &ouraddr->len);
363 if (rr < 0) 363 //if (rr < 0)
364 bb_perror_msg_and_die("getsockname after accept"); 364 // bb_perror_msg_and_die("getsockname after accept");
365 } 365 }
366 366
367 if (o_verbose) { 367 if (o_verbose) {