]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
iplink_vrf: Save device index from response for return code
authorDavid Ahern <dsahern@gmail.com>
Fri, 1 Jun 2018 15:50:16 +0000 (08:50 -0700)
committerStephen Hemminger <stephen@networkplumber.org>
Fri, 1 Jun 2018 19:45:09 +0000 (15:45 -0400)
A recent commit changed rtnl_talk_* to return the response message in
allocated memory so callers need to free it. The change to name_is_vrf
did not save the device index which is pointing to a struct inside the
now allocated and freed memory resulting in garbage getting returned
in some cases.

Fix by using a stack variable to save the return value and only set
it to ifi->ifi_index after all checks are done and before the answer
buffer is freed.

Fixes: 86bf43c7c2fdc ("lib/libnetlink: update rtnl_talk to support malloc buff at run time")
Cc: Hangbin Liu <liuhangbin@gmail.com>
Cc: Phil Sutter <phil@nwl.cc>
Signed-off-by: David Ahern <dsahern@gmail.com>
Acked-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
ip/iplink_vrf.c

index e9dd0df9841294dfc3b13478b904dbe3e027ded5..5d20f29d3526f845344e929ecf14922c9c056925 100644 (file)
@@ -191,6 +191,7 @@ int name_is_vrf(const char *name)
        struct rtattr *tb[IFLA_MAX+1];
        struct rtattr *li[IFLA_INFO_MAX+1];
        struct ifinfomsg *ifi;
+       int ifindex = 0;
        int len;
 
        addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, strlen(name) + 1);
@@ -218,7 +219,8 @@ int name_is_vrf(const char *name)
        if (strcmp(RTA_DATA(li[IFLA_INFO_KIND]), "vrf"))
                goto out;
 
+       ifindex = ifi->ifi_index;
 out:
        free(answer);
-       return ifi->ifi_index;
+       return ifindex;
 }