diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2009-04-21 23:48:38 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2009-04-21 23:48:38 +0000 |
commit | a771e7c0057d0f506f8cdf67be39268e1c9f0735 (patch) | |
tree | bef7afb1304b3510d4857148a50e162a0578c363 | |
parent | e6b10ef0a7a5761c4cd0fe5f48bad953aa92240e (diff) | |
download | busybox-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.c | 21 | ||||
-rw-r--r-- | networking/arping.c | 15 | ||||
-rw-r--r-- | networking/libiproute/iplink.c | 8 | ||||
-rw-r--r-- | networking/libiproute/libnetlink.c | 9 | ||||
-rw-r--r-- | networking/libiproute/libnetlink.h | 3 | ||||
-rw-r--r-- | networking/nc_bloaty.c | 12 |
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 | ||
38 | len_and_sockaddr* FAST_FUNC get_sock_lsa(int fd) | 38 | len_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 | ||
52 | void FAST_FUNC xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen) | 57 | void 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 | ||
11 | PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN | 11 | PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN |
12 | 12 | ||
13 | struct rtnl_handle | 13 | struct 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) { |