From patchwork Mon Aug 11 02:24:24 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yanchuan Nian X-Patchwork-Id: 378875 X-Patchwork-Delegate: pablo@netfilter.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 58A5A140132 for ; Mon, 11 Aug 2014 12:21:43 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751853AbaHKCVi (ORCPT ); Sun, 10 Aug 2014 22:21:38 -0400 Received: from mail-pd0-f181.google.com ([209.85.192.181]:48323 "EHLO mail-pd0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751763AbaHKCVi (ORCPT ); Sun, 10 Aug 2014 22:21:38 -0400 Received: by mail-pd0-f181.google.com with SMTP id g10so9890073pdj.40 for ; Sun, 10 Aug 2014 19:21:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=xQCG2q5jOVLb9FuYlZjqHwmOnvuJdWbCLrQbqQs1txI=; b=RkfQP3Os0aGbesNqMv5GokhfbgEwU6wZB+dlK03+FI5dydvhkHcCEYqYiYfJ3JDbdM 2EQao8RR88PuTs8qqQhnJJDHdD0bkUe05d5g3rxXpJim7D1NGivHAcTgLFK04yQZeMp8 QYf70le52xox34CYFT5iwUtgktYB0iP2yum7e/InEn5m6jHNho5q+hgZ+Qz5CeMbf3Lq HdXzvPyd7FNSQT2Q6BGsTe3ffqM2TbbChY6NGnh5liOTXjUpjXPK00cu0i2QYvxn68tz VhrTvC9MoBiPKfMKupY4KrCmjpDGIbv6Q57rWFtDyLdiPkfdwNpCqhKllWYX5PKFoLP+ we1Q== X-Received: by 10.66.120.99 with SMTP id lb3mr27909132pab.2.1407723697750; Sun, 10 Aug 2014 19:21:37 -0700 (PDT) Received: from localhost ([159.226.5.132]) by mx.google.com with ESMTPSA id ee5sm9673258pbc.47.2014.08.10.19.21.35 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 10 Aug 2014 19:21:37 -0700 (PDT) From: Yanchuan Nian To: pablo@netfilter.org Cc: netfilter-devel@vger.kernel.org, Yanchuan Nian Subject: [nft PATCH] Fix memory leak in nft get operation Date: Mon, 11 Aug 2014 10:24:24 +0800 Message-Id: <1407723864-18211-1-git-send-email-ycnian@gmail.com> X-Mailer: git-send-email 1.9.3 Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org Some memories are forgotten to release on the error path in get operation. Just release them. Also, in netlink_get_chain, it's better to return immediately when a error is detected. Signed-off-by: Yanchuan Nian --- src/netlink.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/netlink.c b/src/netlink.c index e149215..dc7a7c4 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -751,15 +751,17 @@ int netlink_get_chain(struct netlink_ctx *ctx, const struct handle *h, nlc = alloc_nft_chain(h); err = mnl_nft_chain_get(nf_sock, nlc, 0); + if (err < 0) { + nft_chain_free(nlc); + return netlink_io_error(ctx, loc, + "Could not receive chain from kernel: %s", + strerror(errno)); + } chain = netlink_delinearize_chain(ctx, nlc); list_add_tail(&chain->list, &ctx->list); nft_chain_free(nlc); - if (err < 0) - return netlink_io_error(ctx, loc, - "Could not receive chain from kernel: %s", - strerror(errno)); return err; } @@ -1218,16 +1220,18 @@ int netlink_get_set(struct netlink_ctx *ctx, const struct handle *h, nls = alloc_nft_set(h); netlink_dump_set(nls); err = mnl_nft_set_get(nf_sock, nls); - if (err < 0) + if (err < 0) { + nft_set_free(nls); return netlink_io_error(ctx, loc, "Could not receive set from kernel: %s", strerror(errno)); + } set = netlink_delinearize_set(ctx, nls); + nft_set_free(nls); if (set == NULL) return -1; list_add_tail(&set->list, &ctx->list); - nft_set_free(nls); return err; } @@ -1415,6 +1419,7 @@ int netlink_get_setelems(struct netlink_ctx *ctx, const struct handle *h, err = mnl_nft_setelem_get(nf_sock, nls); if (err < 0) { + nft_set_free(nls); if (errno == EINTR) return -1;