aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libbb.h1
-rw-r--r--libbb/bb_getsockname.c19
-rw-r--r--networking/arping.c15
-rw-r--r--networking/inetd.c5
-rw-r--r--networking/libiproute/iplink.c4
-rw-r--r--networking/libiproute/libnetlink.c5
6 files changed, 29 insertions, 20 deletions
diff --git a/include/libbb.h b/include/libbb.h
index e2bedaf41..2c34859a2 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -636,6 +636,7 @@ void setsockopt_reuseaddr(int fd) FAST_FUNC; /* On Linux this never fails. */
636int setsockopt_keepalive(int fd) FAST_FUNC; 636int setsockopt_keepalive(int fd) FAST_FUNC;
637int setsockopt_broadcast(int fd) FAST_FUNC; 637int setsockopt_broadcast(int fd) FAST_FUNC;
638int setsockopt_bindtodevice(int fd, const char *iface) FAST_FUNC; 638int setsockopt_bindtodevice(int fd, const char *iface) FAST_FUNC;
639int bb_getsockname(int sockfd, void *addr, socklen_t addrlen) FAST_FUNC;
639/* NB: returns port in host byte order */ 640/* NB: returns port in host byte order */
640unsigned bb_lookup_port(const char *port, const char *protocol, unsigned default_port) FAST_FUNC; 641unsigned bb_lookup_port(const char *port, const char *protocol, unsigned default_port) FAST_FUNC;
641typedef struct len_and_sockaddr { 642typedef struct len_and_sockaddr {
diff --git a/libbb/bb_getsockname.c b/libbb/bb_getsockname.c
new file mode 100644
index 000000000..1af9b39b9
--- /dev/null
+++ b/libbb/bb_getsockname.c
@@ -0,0 +1,19 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
5 * Licensed under GPLv2, see file LICENSE in this source tree.
6 */
7//kbuild:lib-y += bb_getsockname.o
8
9#include "libbb.h"
10
11int FAST_FUNC bb_getsockname(int sockfd, void *addr, socklen_t addrlen)
12{
13 /* The usefullness of this function is that for getsockname(),
14 * addrlen must go on stack (to _have_ an address to be passed),
15 * but many callers do not need its modified value.
16 * By using this shim, they can avoid unnecessary stack spillage.
17 */
18 return getsockname(sockfd, (struct sockaddr *)addr, &addrlen);
19}
diff --git a/networking/arping.c b/networking/arping.c
index a16f04b9f..59092a7d7 100644
--- a/networking/arping.c
+++ b/networking/arping.c
@@ -363,15 +363,13 @@ int arping_main(int argc UNUSED_PARAM, char **argv)
363 xbind(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)); 363 xbind(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr));
364 } else { /* !(option_mask32 & DAD) case */ 364 } else { /* !(option_mask32 & DAD) case */
365 /* Find IP address on this iface */ 365 /* Find IP address on this iface */
366 socklen_t alen = sizeof(saddr);
367
368 saddr.sin_port = htons(1025); 366 saddr.sin_port = htons(1025);
369 saddr.sin_addr = dst; 367 saddr.sin_addr = dst;
370 368
371 if (setsockopt_SOL_SOCKET_1(probe_fd, SO_DONTROUTE) != 0) 369 if (setsockopt_SOL_SOCKET_1(probe_fd, SO_DONTROUTE) != 0)
372 bb_perror_msg("setsockopt(%s)", "SO_DONTROUTE"); 370 bb_perror_msg("setsockopt(%s)", "SO_DONTROUTE");
373 xconnect(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr)); 371 xconnect(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr));
374 getsockname(probe_fd, (struct sockaddr *) &saddr, &alen); 372 bb_getsockname(probe_fd, (struct sockaddr *) &saddr, sizeof(saddr));
375 //never happens: 373 //never happens:
376 //if (getsockname(probe_fd, (struct sockaddr *) &saddr, &alen) == -1) 374 //if (getsockname(probe_fd, (struct sockaddr *) &saddr, &alen) == -1)
377 // bb_perror_msg_and_die("getsockname"); 375 // bb_perror_msg_and_die("getsockname");
@@ -387,13 +385,10 @@ int arping_main(int argc UNUSED_PARAM, char **argv)
387 me.sll_protocol = htons(ETH_P_ARP); 385 me.sll_protocol = htons(ETH_P_ARP);
388 xbind(sock_fd, (struct sockaddr *) &me, sizeof(me)); 386 xbind(sock_fd, (struct sockaddr *) &me, sizeof(me));
389 387
390 { 388 bb_getsockname(sock_fd, (struct sockaddr *) &me, sizeof(me));
391 socklen_t alen = sizeof(me); 389 //never happens:
392 getsockname(sock_fd, (struct sockaddr *) &me, &alen); 390 //if (getsockname(sock_fd, (struct sockaddr *) &me, &alen) == -1)
393 //never happens: 391 // bb_perror_msg_and_die("getsockname");
394 //if (getsockname(sock_fd, (struct sockaddr *) &me, &alen) == -1)
395 // bb_perror_msg_and_die("getsockname");
396 }
397 if (me.sll_halen == 0) { 392 if (me.sll_halen == 0) {
398 bb_error_msg(err_str, "is not ARPable (no ll address)"); 393 bb_error_msg(err_str, "is not ARPable (no ll address)");
399 BUILD_BUG_ON(DAD != 2); 394 BUILD_BUG_ON(DAD != 2);
diff --git a/networking/inetd.c b/networking/inetd.c
index 4dfa0089a..6843845fb 100644
--- a/networking/inetd.c
+++ b/networking/inetd.c
@@ -497,10 +497,9 @@ static void register_rpc(servtab_t *sep)
497{ 497{
498 int n; 498 int n;
499 struct sockaddr_in ir_sin; 499 struct sockaddr_in ir_sin;
500 socklen_t size;
501 500
502 size = sizeof(ir_sin); 501 if (bb_getsockname(sep->se_fd, (struct sockaddr *) &ir_sin, sizeof(ir_sin)) < 0) {
503 if (getsockname(sep->se_fd, (struct sockaddr *) &ir_sin, &size) < 0) { 502//TODO: verify that such failure is even possible in Linux kernel
504 bb_perror_msg("getsockname"); 503 bb_perror_msg("getsockname");
505 return; 504 return;
506 } 505 }
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c
index aef5f6490..f38fba055 100644
--- a/networking/libiproute/iplink.c
+++ b/networking/libiproute/iplink.c
@@ -132,7 +132,6 @@ static int get_address(char *dev, int *htype)
132{ 132{
133 struct ifreq ifr; 133 struct ifreq ifr;
134 struct sockaddr_ll me; 134 struct sockaddr_ll me;
135 socklen_t alen;
136 int s; 135 int s;
137 136
138 s = xsocket(PF_PACKET, SOCK_DGRAM, 0); 137 s = xsocket(PF_PACKET, SOCK_DGRAM, 0);
@@ -146,8 +145,7 @@ static int get_address(char *dev, int *htype)
146 me.sll_ifindex = ifr.ifr_ifindex; 145 me.sll_ifindex = ifr.ifr_ifindex;
147 me.sll_protocol = htons(ETH_P_LOOP); 146 me.sll_protocol = htons(ETH_P_LOOP);
148 xbind(s, (struct sockaddr*)&me, sizeof(me)); 147 xbind(s, (struct sockaddr*)&me, sizeof(me));
149 alen = sizeof(me); 148 bb_getsockname(s, (struct sockaddr*)&me, sizeof(me));
150 getsockname(s, (struct sockaddr*)&me, &alen);
151 //never happens: 149 //never happens:
152 //if (getsockname(s, (struct sockaddr*)&me, &alen) == -1) 150 //if (getsockname(s, (struct sockaddr*)&me, &alen) == -1)
153 // bb_perror_msg_and_die("getsockname"); 151 // bb_perror_msg_and_die("getsockname");
diff --git a/networking/libiproute/libnetlink.c b/networking/libiproute/libnetlink.c
index f08d862d0..40955fcae 100644
--- a/networking/libiproute/libnetlink.c
+++ b/networking/libiproute/libnetlink.c
@@ -15,16 +15,13 @@
15 15
16void FAST_FUNC xrtnl_open(struct rtnl_handle *rth/*, unsigned subscriptions*/) 16void FAST_FUNC xrtnl_open(struct rtnl_handle *rth/*, unsigned subscriptions*/)
17{ 17{
18 socklen_t addr_len;
19
20 memset(rth, 0, sizeof(*rth)); 18 memset(rth, 0, sizeof(*rth));
21 rth->fd = xsocket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); 19 rth->fd = xsocket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
22 rth->local.nl_family = AF_NETLINK; 20 rth->local.nl_family = AF_NETLINK;
23 /*rth->local.nl_groups = subscriptions;*/ 21 /*rth->local.nl_groups = subscriptions;*/
24 22
25 xbind(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local)); 23 xbind(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local));
26 addr_len = sizeof(rth->local); 24 bb_getsockname(rth->fd, (struct sockaddr*)&rth->local, sizeof(rth->local));
27 getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len);
28 25
29/* too much paranoia 26/* too much paranoia
30 if (getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len) < 0) 27 if (getsockname(rth->fd, (struct sockaddr*)&rth->local, &addr_len) < 0)