From patchwork Mon Mar 16 03:42:56 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tetsuya Mukawa X-Patchwork-Id: 4021 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id CB3589A9F; Mon, 16 Mar 2015 04:43:13 +0100 (CET) Received: from mail-pa0-f49.google.com (mail-pa0-f49.google.com [209.85.220.49]) by dpdk.org (Postfix) with ESMTP id 1D4C75ABA for ; Mon, 16 Mar 2015 04:43:12 +0100 (CET) Received: by padcy3 with SMTP id cy3so51710287pad.3 for ; Sun, 15 Mar 2015 20:43:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=4a1ksL+hBosSf/5xVVXc0HLe7Zqf/300ekayElnx72I=; b=NCjR/qCYFuD5hQd+BK8YcpxmCgASgE6p7GBjKw6tB1gjTqaWb4saFSm7WQzneJQu5H VeBkfMdhIKYj8olpHTHbVjrEyh/KqVINJb4MHM6/AYJKD7Z0ZwZnFw+nd5WNQJLy/y+N SK5atfAvspPs+ZJd8DYz4AyCpwjyo4f6iB2QKNWzid0cjAnF3Buah2rwX2QrtaE9o2pv LVxDuHDKDRntDg5P2stT4eetlDIErWxSGlYgymGYjBe36nZKnTL4THzABBngcbEzOZA1 8KY0S4mpMKdbhqgMfWhBc2aRMJV+6I5FFG8eKpJnHnIFq55mELF8YMp2bHBnI2k03zvI lbBQ== X-Gm-Message-State: ALoCoQnDq4ihm2+J2ob9yMF6L7t69NXjICxHuY9Njub1SnMwvMf+A+vuUaEXmv6CUBcCArRQYXsU X-Received: by 10.70.129.10 with SMTP id ns10mr83567084pdb.87.1426477391302; Sun, 15 Mar 2015 20:43:11 -0700 (PDT) Received: from localhost.localdomain (napt.igel.co.jp. [219.106.231.132]) by mx.google.com with ESMTPSA id bz1sm9958308pab.2.2015.03.15.20.43.08 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 15 Mar 2015 20:43:09 -0700 (PDT) From: Tetsuya Mukawa To: dev@dpdk.org Date: Mon, 16 Mar 2015 12:42:56 +0900 Message-Id: <1426477376-13385-1-git-send-email-mukawa@igel.co.jp> X-Mailer: git-send-email 1.9.1 Subject: [dpdk-dev] [PATCH] pcap, af_packet, null: Fix memory leaks of 'struct rte_kvargs' X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 'struct rte_kvargs' is allocated in rte_kvargs_parse(), and should be freed with rte_kvargs_free(). This patch fixes memory leaks of 'struct rte_kvargs' in below PMDs. - pcap PMD - af_packet PMD - null PMD Reported-by: Mcnamara, John Signed-off-by: Tetsuya Mukawa Acked-by: Neil Horman --- lib/librte_pmd_af_packet/rte_eth_af_packet.c | 5 ++++- lib/librte_pmd_null/rte_eth_null.c | 13 +++++++++---- lib/librte_pmd_pcap/rte_eth_pcap.c | 18 +++++++++++------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/librte_pmd_af_packet/rte_eth_af_packet.c b/lib/librte_pmd_af_packet/rte_eth_af_packet.c index 80e9bdf..7c3c6a9 100644 --- a/lib/librte_pmd_af_packet/rte_eth_af_packet.c +++ b/lib/librte_pmd_af_packet/rte_eth_af_packet.c @@ -823,12 +823,15 @@ rte_pmd_af_packet_devinit(const char *name, const char *params) ret = rte_kvargs_process(kvlist, ETH_AF_PACKET_IFACE_ARG, &open_packet_iface, &sockfd); if (ret < 0) - return -1; + goto free_kvlist_then_return; } ret = rte_eth_from_packet(name, &sockfd, numa_node, kvlist); close(sockfd); /* no longer needed */ +free_kvlist_then_return: + rte_kvargs_free(kvlist); + if (ret < 0) return -1; diff --git a/lib/librte_pmd_null/rte_eth_null.c b/lib/librte_pmd_null/rte_eth_null.c index f49d686..86307eb 100644 --- a/lib/librte_pmd_null/rte_eth_null.c +++ b/lib/librte_pmd_null/rte_eth_null.c @@ -506,7 +506,7 @@ rte_pmd_null_devinit(const char *name, const char *params) unsigned numa_node; unsigned packet_size = default_packet_size; unsigned packet_copy = default_packet_copy; - struct rte_kvargs *kvlist; + struct rte_kvargs *kvlist = NULL; int ret; if (name == NULL) @@ -527,7 +527,7 @@ rte_pmd_null_devinit(const char *name, const char *params) ETH_NULL_PACKET_SIZE_ARG, &get_packet_size_arg, &packet_size); if (ret < 0) - return -1; + goto free_kvlist_then_return; } if (rte_kvargs_count(kvlist, ETH_NULL_PACKET_COPY_ARG) == 1) { @@ -536,7 +536,7 @@ rte_pmd_null_devinit(const char *name, const char *params) ETH_NULL_PACKET_COPY_ARG, &get_packet_copy_arg, &packet_copy); if (ret < 0) - return -1; + goto free_kvlist_then_return; } } @@ -544,7 +544,12 @@ rte_pmd_null_devinit(const char *name, const char *params) "packet copy is %s\n", packet_size, packet_copy ? "enabled" : "disabled"); - return eth_dev_null_create(name, numa_node, packet_size, packet_copy); + ret = eth_dev_null_create(name, numa_node, packet_size, packet_copy); + +free_kvlist_then_return: + if (kvlist) + rte_kvargs_free(kvlist); + return ret; } static int diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.c b/lib/librte_pmd_pcap/rte_eth_pcap.c index 5e94930..de15fb3 100644 --- a/lib/librte_pmd_pcap/rte_eth_pcap.c +++ b/lib/librte_pmd_pcap/rte_eth_pcap.c @@ -888,12 +888,13 @@ rte_pmd_pcap_devinit(const char *name, const char *params) ret = rte_kvargs_process(kvlist, ETH_PCAP_IFACE_ARG, &open_rx_tx_iface, &pcaps); if (ret < 0) - return -1; + goto free_kvlist_then_return; dumpers.pcaps[0] = pcaps.pcaps[0]; dumpers.names[0] = pcaps.names[0]; dumpers.types[0] = pcaps.types[0]; - return rte_eth_from_pcaps(name, &pcaps, 1, &dumpers, 1, + ret = rte_eth_from_pcaps(name, &pcaps, 1, &dumpers, 1, numa_node, kvlist, 1); + goto free_kvlist_then_return; } /* @@ -911,7 +912,7 @@ rte_pmd_pcap_devinit(const char *name, const char *params) } if (ret < 0) - return -1; + goto free_kvlist_then_return; /* * We check whether we want to open a TX stream to a real NIC or a @@ -930,15 +931,18 @@ rte_pmd_pcap_devinit(const char *name, const char *params) } if (ret < 0) - return -1; + goto free_kvlist_then_return; if (using_dumpers) - return rte_eth_from_pcaps_n_dumpers(name, &pcaps, pcaps.num_of_rx, + ret = rte_eth_from_pcaps_n_dumpers(name, &pcaps, pcaps.num_of_rx, &dumpers, dumpers.num_of_tx, numa_node, kvlist); - - return rte_eth_from_pcaps(name, &pcaps, pcaps.num_of_rx, &dumpers, + else + ret = rte_eth_from_pcaps(name, &pcaps, pcaps.num_of_rx, &dumpers, dumpers.num_of_tx, numa_node, kvlist, 0); +free_kvlist_then_return: + rte_kvargs_free(kvlist); + return ret; } static int