DPDK patches and discussions
 help / color / mirror / Atom feed
From: Neil Horman <nhorman@tuxdriver.com>
To: Tetsuya Mukawa <mukawa@igel.co.jp>
Cc: dev@dpdk.org
Subject: Re: [dpdk-dev] [PATCH] pcap, af_packet, null: Fix memory leaks of 'struct rte_kvargs'
Date: Mon, 16 Mar 2015 06:47:10 -0400	[thread overview]
Message-ID: <20150316104710.GA16238@hmsreliant.think-freely.org> (raw)
In-Reply-To: <1426477376-13385-1-git-send-email-mukawa@igel.co.jp>

On Mon, Mar 16, 2015 at 12:42:56PM +0900, Tetsuya Mukawa wrote:
> '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 <john.mcnamara@intel.com>
> Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>

Typically, you should limit your goto tags to something more minimalist that
describes the one thing you want to unwind at the label.  As it stands here,  if
somone wants to add some code after this label, the label either becomes
incorrect, or you need to fix up the label name to match.  But I suppose that
can be corrected later.

Acked-by: Neil Horman <nhorman@tuxdriver.com>


> ---
>  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
> -- 
> 1.9.1
> 
> 

  reply	other threads:[~2015-03-16 10:47 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-16  3:42 Tetsuya Mukawa
2015-03-16 10:47 ` Neil Horman [this message]
2015-03-17  3:53   ` Tetsuya Mukawa
2015-03-16 11:07 ` Mcnamara, John
2015-03-17  3:54   ` Tetsuya Mukawa
2015-03-17  4:12 ` [dpdk-dev] [PATCH v2] pcap, " Tetsuya Mukawa
2015-03-17 21:58   ` Thomas Monjalon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150316104710.GA16238@hmsreliant.think-freely.org \
    --to=nhorman@tuxdriver.com \
    --cc=dev@dpdk.org \
    --cc=mukawa@igel.co.jp \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).