From 4c3493689ed3683ef59855cc47ed586b55e7ee6f Mon Sep 17 00:00:00 2001 From: David Ahern Date: Fri, 1 Jun 2018 08:50:16 -0700 Subject: [PATCH] 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 --- ip/iplink_vrf.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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; } -- 2.47.2