aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
Diffstat (limited to 'libbb')
-rw-r--r--libbb/xconnect.c21
1 files changed, 13 insertions, 8 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)