diff options
Diffstat (limited to 'libbb/udp_io.c')
-rw-r--r-- | libbb/udp_io.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/libbb/udp_io.c b/libbb/udp_io.c index e968ecb66..bde4d779f 100644 --- a/libbb/udp_io.c +++ b/libbb/udp_io.c | |||
@@ -36,11 +36,12 @@ send_to_from(int fd, void *buf, size_t len, int flags, | |||
36 | #else | 36 | #else |
37 | struct iovec iov[1]; | 37 | struct iovec iov[1]; |
38 | struct msghdr msg; | 38 | struct msghdr msg; |
39 | char cbuf[sizeof(struct in_pktinfo) | 39 | union { |
40 | char cmsg[CMSG_SPACE(sizeof(struct in_pktinfo))]; | ||
40 | #if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO) | 41 | #if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO) |
41 | | sizeof(struct in6_pktinfo) /* (a|b) is poor man's max(a,b) */ | 42 | char cmsg6[CMSG_SPACE(sizeof(struct in6_pktinfo))]; |
42 | #endif | 43 | #endif |
43 | ]; | 44 | } u; |
44 | struct cmsghdr* cmsgptr; | 45 | struct cmsghdr* cmsgptr; |
45 | 46 | ||
46 | if (from->sa_family != AF_INET | 47 | if (from->sa_family != AF_INET |
@@ -57,15 +58,15 @@ send_to_from(int fd, void *buf, size_t len, int flags, | |||
57 | iov[0].iov_base = buf; | 58 | iov[0].iov_base = buf; |
58 | iov[0].iov_len = len; | 59 | iov[0].iov_len = len; |
59 | 60 | ||
60 | memset(cbuf, 0, sizeof(cbuf)); | 61 | memset(&u, 0, sizeof(u)); |
61 | 62 | ||
62 | memset(&msg, 0, sizeof(msg)); | 63 | memset(&msg, 0, sizeof(msg)); |
63 | msg.msg_name = (void *)(struct sockaddr *)to; /* or compiler will annoy us */ | 64 | msg.msg_name = (void *)(struct sockaddr *)to; /* or compiler will annoy us */ |
64 | msg.msg_namelen = tolen; | 65 | msg.msg_namelen = tolen; |
65 | msg.msg_iov = iov; | 66 | msg.msg_iov = iov; |
66 | msg.msg_iovlen = 1; | 67 | msg.msg_iovlen = 1; |
67 | msg.msg_control = cbuf; | 68 | msg.msg_control = &u; |
68 | msg.msg_controllen = sizeof(cbuf); | 69 | msg.msg_controllen = sizeof(u); |
69 | msg.msg_flags = flags; | 70 | msg.msg_flags = flags; |
70 | 71 | ||
71 | cmsgptr = CMSG_FIRSTHDR(&msg); | 72 | cmsgptr = CMSG_FIRSTHDR(&msg); |
@@ -89,6 +90,8 @@ send_to_from(int fd, void *buf, size_t len, int flags, | |||
89 | pktptr->ipi6_addr = ((struct sockaddr_in6*)from)->sin6_addr; | 90 | pktptr->ipi6_addr = ((struct sockaddr_in6*)from)->sin6_addr; |
90 | } | 91 | } |
91 | #endif | 92 | #endif |
93 | msg.msg_controllen = cmsgptr->cmsg_len; | ||
94 | |||
92 | return sendmsg(fd, &msg, flags); | 95 | return sendmsg(fd, &msg, flags); |
93 | #endif | 96 | #endif |
94 | } | 97 | } |
@@ -109,7 +112,9 @@ recv_from_to(int fd, void *buf, size_t len, int flags, | |||
109 | struct iovec iov[1]; | 112 | struct iovec iov[1]; |
110 | union { | 113 | union { |
111 | char cmsg[CMSG_SPACE(sizeof(struct in_pktinfo))]; | 114 | char cmsg[CMSG_SPACE(sizeof(struct in_pktinfo))]; |
115 | #if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO) | ||
112 | char cmsg6[CMSG_SPACE(sizeof(struct in6_pktinfo))]; | 116 | char cmsg6[CMSG_SPACE(sizeof(struct in6_pktinfo))]; |
117 | #endif | ||
113 | } u; | 118 | } u; |
114 | struct cmsghdr *cmsgptr; | 119 | struct cmsghdr *cmsgptr; |
115 | struct msghdr msg; | 120 | struct msghdr msg; |