From mboxrd@z Thu Jan 1 00:00:00 1970 From: dsahern@kernel.org Subject: [PATCH iproute2] iplink_vrf: Save device index from response for return code Date: Fri, 1 Jun 2018 08:50:16 -0700 Message-ID: <20180601155016.3524-1-dsahern@kernel.org> Cc: David Ahern , Hangbin Liu , Phil Sutter To: stephen@networkplumber.org, netdev@vger.kernel.org Return-path: Received: from mail.kernel.org ([198.145.29.99]:44468 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752653AbeFAPuS (ORCPT ); Fri, 1 Jun 2018 11:50:18 -0400 Sender: netdev-owner@vger.kernel.org List-ID: From: David Ahern 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 --- 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 e9dd0df98412..6004bb4f305e 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.11.0