]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
DHCP: Use correct buffer for receiving UDP
authorRoy Marples <roy@marples.name>
Tue, 5 May 2020 19:03:49 +0000 (19:03 +0000)
committerRoy Marples <roy@marples.name>
Tue, 5 May 2020 19:03:49 +0000 (19:03 +0000)
Big wup!
While here, ensure buffer is aligned to the structure we want
to read.

src/dhcp.c
src/dhcp6.c
src/ipv6nd.c

index 927f2137b8705b1a1fca6219d4637bb8379b7bac..23ba8761888c786b603f98228daac87bee8a5703 100644 (file)
@@ -3599,7 +3599,7 @@ dhcp_recvmsg(struct dhcpcd_ctx *ctx, struct msghdr *msg)
        }
 #endif
 
-       dhcp_handlebootp(ifp, (struct bootp *)iov->iov_base, iov->iov_len,
+       dhcp_handlebootp(ifp, iov->iov_base, iov->iov_len,
            &from->sin_addr);
 }
 
@@ -3608,10 +3608,13 @@ dhcp_readudp(struct dhcpcd_ctx *ctx, struct interface *ifp)
 {
        const struct dhcp_state *state;
        struct sockaddr_in from;
-       unsigned char buf[10 * 1024]; /* Maximum MTU */
+       union {
+               struct bootp bootp;
+               uint8_t buf[10 * 1024]; /* Maximum MTU */
+       } iovbuf;
        struct iovec iov = {
-               .iov_base = buf,
-               .iov_len = sizeof(buf),
+               .iov_base = iovbuf.buf,
+               .iov_len = sizeof(iovbuf.buf),
        };
        union {
                struct cmsghdr hdr;
@@ -3624,7 +3627,7 @@ dhcp_readudp(struct dhcpcd_ctx *ctx, struct interface *ifp)
        struct msghdr msg = {
            .msg_name = &from, .msg_namelen = sizeof(from),
            .msg_iov = &iov, .msg_iovlen = 1,
-           .msg_control = buf, .msg_controllen = sizeof(cmsgbuf.buf),
+           .msg_control = cmsgbuf.buf, .msg_controllen = sizeof(cmsgbuf.buf),
        };
        int s;
        ssize_t bytes;
index 0f2f324b760c09a1057f19a2f545ae09c57a3685..2c0fed5215c830cb089cc6c4d5e29e8e8af4db5a 100644 (file)
@@ -3721,10 +3721,12 @@ static void
 dhcp6_recv(struct dhcpcd_ctx *ctx, struct ipv6_addr *ia)
 {
        struct sockaddr_in6 from;
-       unsigned char buf[64 * 1024]; /* Maximum UDP message size */
+       union {
+               struct dhcp6_message dhcp6;
+               uint8_t buf[64 * 1024]; /* Maximum UDP message size */
+       } iovbuf;
        struct iovec iov = {
-               .iov_base = buf,
-               .iov_len = sizeof(buf),
+               .iov_base = iovbuf.buf, .iov_len = sizeof(iovbuf.buf),
        };
        union {
                struct cmsghdr hdr;
index 73df91097b81c8c91c74cc372352f861fc2f228f..ae267c7acae9dfb1c2ce6c0ce9330319385fa03d 100644 (file)
@@ -1937,10 +1937,12 @@ ipv6nd_handledata(void *arg)
        struct dhcpcd_ctx *ctx;
        int fd;
        struct sockaddr_in6 from;
-       unsigned char buf[64 * 1024]; /* Maximum ICMPv6 size */
+       union {
+               struct icmp6_hdr hdr;
+               uint8_t buf[64 * 1024]; /* Maximum ICMPv6 size */
+       } iovbuf;
        struct iovec iov = {
-               .iov_base = buf,
-               .iov_len = sizeof(buf),
+               .iov_base = iovbuf.buf, .iov_len = sizeof(iovbuf.buf),
        };
        union {
                struct cmsghdr hdr;