Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9027581 authored by Lorenzo Colitti's avatar Lorenzo Colitti
Browse files

Properly size response buffer in ifc_act_on_address

Currently, any netlink error reported in ifc_act_on_address is
reported as EINVAL, because the receive buffer is too short and
the NLMSG_OK check fails on it.

Make the buffer long enough so the function can return the
correct netlink error to the caller.

Test: new test coverage in other CL in this topic
Change-Id: Ica752db834a0fd614312b800d88721826be08d56
parent c3d38969
Loading
Loading
Loading
Loading
+4 −9
Original line number Diff line number Diff line
@@ -267,19 +267,13 @@ int ifc_act_on_address(int action, const char *name, const char *address,
    struct {
        struct nlmsghdr n;
        struct ifaddrmsg r;
        // Allow for IPv6 address, headers, IPv4 broadcast addr and padding.
        char attrbuf[NLMSG_ALIGN(sizeof(struct nlmsghdr)) +
                     NLMSG_ALIGN(sizeof(struct rtattr)) +
                     NLMSG_ALIGN(INET6_ADDRLEN) +
                     NLMSG_ALIGN(sizeof(struct rtattr)) +
                     NLMSG_ALIGN(INET_ADDRLEN)];
        // Allow for IPv4 or IPv6 address, headers, IPv4 broadcast address and padding.
        char attrbuf[NLMSG_ALIGN(sizeof(struct rtattr)) + NLMSG_ALIGN(INET6_ADDRLEN) +
                     NLMSG_ALIGN(sizeof(struct rtattr)) + NLMSG_ALIGN(INET_ADDRLEN)];
    } req;
    struct rtattr *rta;
    struct nlmsghdr *nh;
    struct nlmsgerr *err;
    char buf[NLMSG_ALIGN(sizeof(struct nlmsghdr)) +
             NLMSG_ALIGN(sizeof(struct nlmsgerr)) +
             NLMSG_ALIGN(sizeof(struct nlmsghdr))];

    // Get interface ID.
    ifindex = if_nametoindex(name);
@@ -348,6 +342,7 @@ int ifc_act_on_address(int action, const char *name, const char *address,
        return -saved_errno;
    }

    char buf[NLMSG_ALIGN(sizeof(struct nlmsgerr)) + sizeof(req)];
    len = recv(s, buf, sizeof(buf), 0);
    saved_errno = errno;
    close(s);