]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
recvmsg expects an array of iovec structures, not a pointer to the first one.
authorRoy Marples <roy@marples.name>
Mon, 5 Sep 2016 22:27:47 +0000 (22:27 +0000)
committerRoy Marples <roy@marples.name>
Mon, 5 Sep 2016 22:27:47 +0000 (22:27 +0000)
dhcpcd.c
dhcpcd.h
if-bsd.c
if-linux.c
if-sun.c

index a33e67f6b30cd1bdf826bdb0466c09da674032c7..d9f3e13e7f5bcfa005cc383432fb62f70e08a9c1 100644 (file)
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -1970,7 +1970,7 @@ exit1:
        if (control_stop(&ctx) == -1)
                logger(&ctx, LOG_ERR, "control_stop: %m:");
        eloop_free(ctx.eloop);
-       free(ctx.iov.iov_base);
+       free(ctx.iov[0].iov_base);
 
        if (ctx.options & DHCPCD_STARTED && !(ctx.options & DHCPCD_FORKED))
                logger(&ctx, LOG_INFO, PACKAGE " exited");
index 7d8244f79cfcb6a7df7322c5ffc293ff14b3bee7..a41360d150024146f0bb08786a4ba1f69bf816c3 100644 (file)
--- a/dhcpcd.h
+++ b/dhcpcd.h
@@ -121,7 +121,7 @@ struct dhcpcd_ctx {
        int link_fd;
        int seq;        /* route message sequence no */
        int sseq;       /* successful seq no sent */
-       struct iovec iov;       /* generic iovec buffer */
+       struct iovec iov[1];    /* generic iovec buffer */
 
 #ifdef USE_SIGNALS
        sigset_t sigset;
index 6276508acf5ab7eca8a665fd41346c8e9dbb0bef..26f5c3a8aaae573b1f91148775d3eff68d0bba19 100644 (file)
--- a/if-bsd.c
+++ b/if-bsd.c
@@ -1548,12 +1548,12 @@ if_handlelink(struct dhcpcd_ctx *ctx)
        ssize_t bytes;
 
        memset(&msg, 0, sizeof(msg));
-       msg.msg_iov = &ctx->iov;
+       msg.msg_iov = ctx->iov;
        msg.msg_iovlen = 1;
 
        if ((bytes = recvmsg_realloc(ctx->link_fd, &msg, 0)) == -1)
                return -1;
-       if_dispatch(ctx, ctx->iov.iov_base);
+       if_dispatch(ctx, ctx->iov[0].iov_base);
        return 0;
 }
 
index 3b49fd6ac1ce0a63cbcad309f04a135c5584c568..564d0baceb56db404d1f04deb1c61d69390f88e5 100644 (file)
@@ -94,7 +94,7 @@ int if_getssid_wext(const char *ifname, uint8_t *ssid);
 struct priv {
        int route_fd;
        uint32_t route_pid;
-       struct iovec link_iov;
+       struct iovec link_iov[1];
 };
 
 /* Broadcast address for IPoIB */
@@ -300,8 +300,6 @@ if_opensockets_os(struct dhcpcd_ctx *ctx)
        if (getsockname(priv->route_fd, (struct sockaddr *)&snl, &len) == -1)
                return -1;
        priv->route_pid = snl.nl_pid;
-       priv->link_iov.iov_base = NULL;
-       priv->link_iov.iov_len = 0;
        return 0;
 }
 
@@ -312,7 +310,7 @@ if_closesockets_os(struct dhcpcd_ctx *ctx)
 
        if (ctx->priv != NULL) {
                priv = (struct priv *)ctx->priv;
-               free(priv->link_iov.iov_base);
+               free(priv->link_iov[0].iov_base);
                close(priv->route_fd);
        }
 }
@@ -859,7 +857,7 @@ if_handlelink(struct dhcpcd_ctx *ctx)
        struct priv *priv;
 
        priv = (struct priv *)ctx->priv;
-       return get_netlink(ctx, &priv->link_iov, NULL,
+       return get_netlink(ctx, priv->link_iov, NULL,
            ctx->link_fd, MSG_DONTWAIT, &link_netlink);
 }
 
@@ -899,7 +897,7 @@ send_netlink(struct dhcpcd_ctx *ctx, struct interface *ifp,
        hdr->nlmsg_seq = (uint32_t)++ctx->seq;
        if (sendmsg(s, &msg, 0) != -1) {
                ctx->sseq = ctx->seq;
-               r = get_netlink(ctx, &ctx->iov, ifp, s, 0, callback);
+               r = get_netlink(ctx, ctx->iov, ifp, s, 0, callback);
        } else
                r = -1;
        if (protocol != NETLINK_ROUTE)
index 8ce1887bdfcb1dc0e1c986f89bbd3b94adbe57df..50897b28b792ea745575ae4f91cee809fc3aeb96 100644 (file)
--- a/if-sun.c
+++ b/if-sun.c
@@ -773,12 +773,12 @@ if_handlelink(struct dhcpcd_ctx *ctx)
        ssize_t bytes;
 
        memset(&msg, 0, sizeof(msg));
-       msg.msg_iov = &ctx->iov;
+       msg.msg_iov = ctx->iov;
        msg.msg_iovlen = 1;
 
        if ((bytes = recvmsg_realloc(ctx->link_fd, &msg, 0)) == -1)
                return -1;
-       if_dispatch(ctx, ctx->iov.iov_base);
+       if_dispatch(ctx, ctx->iov[0].iov_base);
        return 0;
 }