From: David Ahern Date: Fri, 1 Jun 2018 15:50:16 +0000 (-0700) Subject: iplink_vrf: Save device index from response for return code X-Git-Tag: v4.17.0~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4c3493689ed3683ef59855cc47ed586b55e7ee6f;p=thirdparty%2Fiproute2.git iplink_vrf: Save device index from response for return code 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 Cc: Phil Sutter Signed-off-by: David Ahern Acked-by: Phil Sutter Signed-off-by: Stephen Hemminger --- diff --git a/ip/iplink_vrf.c b/ip/iplink_vrf.c index e9dd0df98..5d20f29d3 100644 --- a/ip/iplink_vrf.c +++ b/ip/iplink_vrf.c @@ -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; }