From patchwork Thu Oct 18 12:30:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phil Sutter X-Patchwork-Id: 985837 X-Patchwork-Delegate: shemminger@vyatta.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=nwl.cc Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42bT0j4ThQz9s9J for ; Thu, 18 Oct 2018 23:30:45 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726871AbeJRUbb (ORCPT ); Thu, 18 Oct 2018 16:31:31 -0400 Received: from orbyte.nwl.cc ([151.80.46.58]:32964 "EHLO orbyte.nwl.cc" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726424AbeJRUbb (ORCPT ); Thu, 18 Oct 2018 16:31:31 -0400 Received: from localhost ([::1]:40498 helo=tatos) by orbyte.nwl.cc with esmtp (Exim 4.91) (envelope-from ) id 1gD7Rp-0001vD-HH; Thu, 18 Oct 2018 14:30:41 +0200 From: Phil Sutter To: Stephen Hemminger Cc: netdev@vger.kernel.org Subject: [iproute PATCH] ip-route: Fix for memleak in error path Date: Thu, 18 Oct 2018 14:30:31 +0200 Message-Id: <20181018123031.19854-1-phil@nwl.cc> X-Mailer: git-send-email 2.19.0 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org If call to rta_addattr_l() failed, parse_encap_seg6() would leak memory. Fix this by making sure calls to free() are not skipped. Fixes: bd59e5b1517b0 ("ip-route: Fix segfault with many nexthops") Signed-off-by: Phil Sutter --- ip/iproute_lwtunnel.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c index 969a4763df71d..85045d4fff742 100644 --- a/ip/iproute_lwtunnel.c +++ b/ip/iproute_lwtunnel.c @@ -498,6 +498,7 @@ static int parse_encap_seg6(struct rtattr *rta, size_t len, int *argcp, int argc = *argcp; int encap = -1; __u32 hmac = 0; + int ret = 0; int srhlen; while (argc > 0) { @@ -539,16 +540,19 @@ static int parse_encap_seg6(struct rtattr *rta, size_t len, int *argcp, memcpy(tuninfo->srh, srh, srhlen); if (rta_addattr_l(rta, len, SEG6_IPTUNNEL_SRH, tuninfo, - sizeof(*tuninfo) + srhlen)) - return -1; - - free(tuninfo); - free(srh); + sizeof(*tuninfo) + srhlen)) { + ret = -1; + goto out; + } *argcp = argc + 1; *argvp = argv - 1; - return 0; +out: + free(tuninfo); + free(srh); + + return ret; } struct lwt_x {