patches for DPDK stable branches
 help / color / mirror / Atom feed
From: "Burakov, Anatoly" <anatoly.burakov@intel.com>
To: Yongseok Koh <yskoh@mellanox.com>
Cc: dpdk stable <stable@dpdk.org>
Subject: Re: [dpdk-stable] please check if patch 'eal: fix strdup usages in internal config' is applicable to LTS release 17.11.6
Date: Mon, 11 Mar 2019 10:08:00 +0000	[thread overview]
Message-ID: <C6ECDF3AB251BE4894318F4E4512369782EED6A1@IRSMSX107.ger.corp.intel.com> (raw)
In-Reply-To: <20190308180901.31938-1-yskoh@mellanox.com>

It's not a critical bugfix, so it can be left out of it is deemed too much change for a stable release. However, it is indeed applicable to stable, and can be merged.

Thanks,
Anatoly


> -----Original Message-----
> From: Yongseok Koh [mailto:yskoh@mellanox.com]
> Sent: Friday, March 8, 2019 6:09 PM
> To: Burakov, Anatoly <anatoly.burakov@intel.com>
> Cc: dpdk stable <stable@dpdk.org>
> Subject: please check if patch 'eal: fix strdup usages in internal config' is
> applicable to LTS release 17.11.6
> 
> Hi,
> 
> Even though the patch doesn't have "Cc: stable@dpdk.org" tag or "Fixes:"
> tag, the commit log says it fixes some issue. Tags might be mistakenly missed.
> We don't want to miss any fixes for stable releases. That's why I'm sending
> this email.
> 
> Please send backports if you think the patch should be merged to LTS release
> 17.11.6 Or, let me know if you have any comments, say, need more time, or
> it's worthless to backport it. And please send it to "stable@dpdk.org", but
> not "dev@dpdk.org".
> 
> FYI, branch 17.11 is located at tree:
>    git://dpdk.org/dpdk-stable
> 
> It'd be great if you could do that in one or two weeks. Also, please add a
> heading line like below before the commit log body:
>     [ backported from upstream commit xxx ]
> 
> Example: http://dpdk.org/browse/dpdk-
> stable/commit/?h=16.07&id=c4831394c7d1944d8ec27d52c22997f20d19718e
> 
> Also please mention the target LTS in the subject line, as we have more than
> one at the same time, for example:
> 
>     [PATCH 17.11] foo/bar: fix baz
> 
> With git send-email, this can be achieved by appending the parameter:
> 
>     --subject-prefix='17.11'
> 
> 
> Thanks.
> 
> Yongseok
> 
> ---
> From 66d9f61de0885bd07662a016542600fe139d4eed Mon Sep 17 00:00:00
> 2001
> From: Anatoly Burakov <anatoly.burakov@intel.com>
> Date: Thu, 10 Jan 2019 13:38:59 +0000
> Subject: [PATCH] eal: fix strdup usages in internal config
> 
> Currently, we use strdup in a few places to store command-line parameter
> values for certain internal config values. There are several issues with that.
> 
> First of all, they're never freed, so memory ends up leaking either after EAL
> exit, or when these command-line options are supplied multiple times.
> 
> Second of all, they're defined as `const char *`, so they
> *cannot* be freed even if we wanted to.
> 
> Finally, strdup may return NULL, which will be stored in the config. For most
> fields, NULL is a valid value, but for the default prefix, the value is always
> expected to be valid.
> 
> To fix all of this, three things are done. First, we change the definitions of
> these values to `char *` as opposed to `const char *`. This does not break the
> ABI, and previous code assumes constness (which is more restrictive), so it's
> safe to do so.
> 
> Then, fix all usages of strdup to check return value, and add a cleanup
> function that will free the memory occupied by these strings, as well as
> freeing them before assigning a new value to prevent leaks when parameter
> is specified multiple times.
> 
> And finally, add an internal API to query hugefile prefix, so that, absent of a
> valid value, a default value will be returned, and also fix up all usages of
> hugefile prefix to use this API instead of accessing hugefile prefix directly.
> 
> Bugzilla ID: 108
> 
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> ---
>  lib/librte_eal/bsdapp/eal/eal.c            | 19 ++++++++++--
>  lib/librte_eal/common/eal_common_options.c | 25 ++++++++++++++--
>  lib/librte_eal/common/eal_filesystem.h     |  6 +++-
>  lib/librte_eal/common/eal_internal_cfg.h   |  6 ++--
>  lib/librte_eal/common/eal_options.h        |  1 +
>  lib/librte_eal/linuxapp/eal/eal.c          | 46 ++++++++++++++++++++++++----
> --
>  lib/librte_eal/linuxapp/eal/eal_memory.c   |  2 +-
>  7 files changed, 87 insertions(+), 18 deletions(-)
> 
> diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
> index c8e0da097..1ba9bd7cf 100644
> --- a/lib/librte_eal/bsdapp/eal/eal.c
> +++ b/lib/librte_eal/bsdapp/eal/eal.c
> @@ -117,7 +117,7 @@ eal_create_runtime_dir(void)
> 
>  	/* create prefix-specific subdirectory under DPDK runtime dir */
>  	ret = snprintf(runtime_dir, sizeof(runtime_dir), "%s/%s",
> -			tmp, internal_config.hugefile_prefix);
> +			tmp, eal_get_hugefile_prefix());
>  	if (ret < 0 || ret == sizeof(runtime_dir)) {
>  		RTE_LOG(ERR, EAL, "Error creating prefix-specific runtime
> path name\n");
>  		return -1;
> @@ -535,9 +535,21 @@ eal_parse_args(int argc, char **argv)
> 
>  		switch (opt) {
>  		case OPT_MBUF_POOL_OPS_NAME_NUM:
> -			internal_config.user_mbuf_pool_ops_name =
> -			    strdup(optarg);
> +		{
> +			char *ops_name = strdup(optarg);
> +			if (ops_name == NULL)
> +				RTE_LOG(ERR, EAL, "Could not store mbuf
> pool ops name\n");
> +			else {
> +				/* free old ops name */
> +				if
> (internal_config.user_mbuf_pool_ops_name !=
> +						NULL)
> +
> 	free(internal_config.user_mbuf_pool_ops_name);
> +
> +				internal_config.user_mbuf_pool_ops_name
> =
> +						ops_name;
> +			}
>  			break;
> +		}
>  		case 'h':
>  			eal_usage(prgname);
>  			exit(EXIT_SUCCESS);
> @@ -923,6 +935,7 @@ rte_eal_cleanup(void)  {
>  	rte_service_finalize();
>  	rte_mp_channel_cleanup();
> +	eal_cleanup_config(&internal_config);
>  	return 0;
>  }
> 
> diff --git a/lib/librte_eal/common/eal_common_options.c
> b/lib/librte_eal/common/eal_common_options.c
> index 6e3a83b98..a2d862b5f 100644
> --- a/lib/librte_eal/common/eal_common_options.c
> +++ b/lib/librte_eal/common/eal_common_options.c
> @@ -169,6 +169,14 @@ eal_option_device_parse(void)
>  	return ret;
>  }
> 
> +const char *
> +eal_get_hugefile_prefix(void)
> +{
> +	if (internal_config.hugefile_prefix != NULL)
> +		return internal_config.hugefile_prefix;
> +	return HUGEFILE_PREFIX_DEFAULT;
> +}
> +
>  void
>  eal_reset_internal_config(struct internal_config *internal_cfg)  { @@ -177,7
> +185,7 @@ eal_reset_internal_config(struct internal_config *internal_cfg)
>  	internal_cfg->memory = 0;
>  	internal_cfg->force_nrank = 0;
>  	internal_cfg->force_nchannel = 0;
> -	internal_cfg->hugefile_prefix = HUGEFILE_PREFIX_DEFAULT;
> +	internal_cfg->hugefile_prefix = NULL;
>  	internal_cfg->hugepage_dir = NULL;
>  	internal_cfg->force_sockets = 0;
>  	/* zero out the NUMA config */
> @@ -1348,6 +1356,19 @@ eal_auto_detect_cores(struct rte_config *cfg)  }
> 
>  int
> +eal_cleanup_config(struct internal_config *internal_cfg) {
> +	if (internal_cfg->hugefile_prefix != NULL)
> +		free(internal_cfg->hugefile_prefix);
> +	if (internal_cfg->hugepage_dir != NULL)
> +		free(internal_cfg->hugepage_dir);
> +	if (internal_cfg->user_mbuf_pool_ops_name != NULL)
> +		free(internal_cfg->user_mbuf_pool_ops_name);
> +
> +	return 0;
> +}
> +
> +int
>  eal_adjust_config(struct internal_config *internal_cfg)  {
>  	int i;
> @@ -1387,7 +1408,7 @@ eal_check_common_options(struct internal_config
> *internal_cfg)
>  		RTE_LOG(ERR, EAL, "Invalid process type specified\n");
>  		return -1;
>  	}
> -	if (index(internal_cfg->hugefile_prefix, '%') != NULL) {
> +	if (index(eal_get_hugefile_prefix(), '%') != NULL) {
>  		RTE_LOG(ERR, EAL, "Invalid char, '%%', in --
> "OPT_FILE_PREFIX" "
>  			"option\n");
>  		return -1;
> diff --git a/lib/librte_eal/common/eal_filesystem.h
> b/lib/librte_eal/common/eal_filesystem.h
> index 64a028db7..89a3added 100644
> --- a/lib/librte_eal/common/eal_filesystem.h
> +++ b/lib/librte_eal/common/eal_filesystem.h
> @@ -28,6 +28,10 @@ eal_create_runtime_dir(void);  int
> eal_clean_runtime_dir(void);
> 
> +/** Function to return hugefile prefix that's currently set up */ const
> +char * eal_get_hugefile_prefix(void);
> +
>  #define RUNTIME_CONFIG_FNAME "config"
>  static inline const char *
>  eal_runtime_config_path(void)
> @@ -89,7 +93,7 @@ static inline const char *  eal_get_hugefile_path(char
> *buffer, size_t buflen, const char *hugedir, int f_id)  {
>  	snprintf(buffer, buflen, HUGEFILE_FMT, hugedir,
> -			internal_config.hugefile_prefix, f_id);
> +			eal_get_hugefile_prefix(), f_id);
>  	buffer[buflen - 1] = '\0';
>  	return buffer;
>  }
> diff --git a/lib/librte_eal/common/eal_internal_cfg.h
> b/lib/librte_eal/common/eal_internal_cfg.h
> index 98e314fef..60eaead8f 100644
> --- a/lib/librte_eal/common/eal_internal_cfg.h
> +++ b/lib/librte_eal/common/eal_internal_cfg.h
> @@ -66,9 +66,9 @@ struct internal_config {
>  	volatile int syslog_facility;	  /**< facility passed to openlog() */
>  	/** default interrupt mode for VFIO */
>  	volatile enum rte_intr_mode vfio_intr_mode;
> -	const char *hugefile_prefix;      /**< the base filename of hugetlbfs
> files */
> -	const char *hugepage_dir;         /**< specific hugetlbfs directory to
> use */
> -	const char *user_mbuf_pool_ops_name;
> +	char *hugefile_prefix;      /**< the base filename of hugetlbfs files */
> +	char *hugepage_dir;         /**< specific hugetlbfs directory to use */
> +	char *user_mbuf_pool_ops_name;
>  			/**< user defined mbuf pool ops name */
>  	unsigned num_hugepage_sizes;      /**< how many sizes on this
> system */
>  	struct hugepage_info hugepage_info[MAX_HUGEPAGE_SIZES];
> diff --git a/lib/librte_eal/common/eal_options.h
> b/lib/librte_eal/common/eal_options.h
> index 1480c5d77..58ee9ae33 100644
> --- a/lib/librte_eal/common/eal_options.h
> +++ b/lib/librte_eal/common/eal_options.h
> @@ -77,6 +77,7 @@ int eal_parse_common_option(int opt, const char
> *argv,
>  			    struct internal_config *conf);
>  int eal_option_device_parse(void);
>  int eal_adjust_config(struct internal_config *internal_cfg);
> +int eal_cleanup_config(struct internal_config *internal_cfg);
>  int eal_check_common_options(struct internal_config *internal_cfg);  void
> eal_common_usage(void);  enum rte_proc_type_t
> eal_proc_type_detect(void); diff --git a/lib/librte_eal/linuxapp/eal/eal.c
> b/lib/librte_eal/linuxapp/eal/eal.c
> index 2d8d470b8..a386829f3 100644
> --- a/lib/librte_eal/linuxapp/eal/eal.c
> +++ b/lib/librte_eal/linuxapp/eal/eal.c
> @@ -125,7 +125,7 @@ eal_create_runtime_dir(void)
> 
>  	/* create prefix-specific subdirectory under DPDK runtime dir */
>  	ret = snprintf(runtime_dir, sizeof(runtime_dir), "%s/%s",
> -			tmp, internal_config.hugefile_prefix);
> +			tmp, eal_get_hugefile_prefix());
>  	if (ret < 0 || ret == sizeof(runtime_dir)) {
>  		RTE_LOG(ERR, EAL, "Error creating prefix-specific runtime
> path name\n");
>  		return -1;
> @@ -727,13 +727,31 @@ eal_parse_args(int argc, char **argv)
>  			exit(EXIT_SUCCESS);
> 
>  		case OPT_HUGE_DIR_NUM:
> -			internal_config.hugepage_dir = strdup(optarg);
> +		{
> +			char *hdir = strdup(optarg);
> +			if (hdir == NULL)
> +				RTE_LOG(ERR, EAL, "Could not store
> hugepage directory\n");
> +			else {
> +				/* free old hugepage dir */
> +				if (internal_config.hugepage_dir != NULL)
> +					free(internal_config.hugepage_dir);
> +				internal_config.hugepage_dir = hdir;
> +			}
>  			break;
> -
> +		}
>  		case OPT_FILE_PREFIX_NUM:
> -			internal_config.hugefile_prefix = strdup(optarg);
> +		{
> +			char *prefix = strdup(optarg);
> +			if (prefix == NULL)
> +				RTE_LOG(ERR, EAL, "Could not store file
> prefix\n");
> +			else {
> +				/* free old prefix */
> +				if (internal_config.hugefile_prefix != NULL)
> +					free(internal_config.hugefile_prefix);
> +				internal_config.hugefile_prefix = prefix;
> +			}
>  			break;
> -
> +		}
>  		case OPT_SOCKET_MEM_NUM:
>  			if (eal_parse_socket_arg(optarg,
>  					internal_config.socket_mem) < 0) {
> @@ -783,10 +801,21 @@ eal_parse_args(int argc, char **argv)
>  			break;
> 
>  		case OPT_MBUF_POOL_OPS_NAME_NUM:
> -			internal_config.user_mbuf_pool_ops_name =
> -			    strdup(optarg);
> +		{
> +			char *ops_name = strdup(optarg);
> +			if (ops_name == NULL)
> +				RTE_LOG(ERR, EAL, "Could not store mbuf
> pool ops name\n");
> +			else {
> +				/* free old ops name */
> +				if
> (internal_config.user_mbuf_pool_ops_name !=
> +						NULL)
> +
> 	free(internal_config.user_mbuf_pool_ops_name);
> +
> +				internal_config.user_mbuf_pool_ops_name
> =
> +						ops_name;
> +			}
>  			break;
> -
> +		}
>  		case OPT_MATCH_ALLOCATIONS_NUM:
>  			internal_config.match_allocations = 1;
>  			break;
> @@ -1238,6 +1267,7 @@ rte_eal_cleanup(void)
>  		rte_memseg_walk(mark_freeable, NULL);
>  	rte_service_finalize();
>  	rte_mp_channel_cleanup();
> +	eal_cleanup_config(&internal_config);
>  	return 0;
>  }
> 
> diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c
> b/lib/librte_eal/linuxapp/eal/eal_memory.c
> index 7d922a965..1b96b576e 100644
> --- a/lib/librte_eal/linuxapp/eal/eal_memory.c
> +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
> @@ -438,7 +438,7 @@ find_numasocket(struct hugepage_file *hugepg_tbl,
> struct hugepage_info *hpi)
>  	}
> 
>  	snprintf(hugedir_str, sizeof(hugedir_str),
> -			"%s/%s", hpi->hugedir,
> internal_config.hugefile_prefix);
> +			"%s/%s", hpi->hugedir, eal_get_hugefile_prefix());
> 
>  	/* parse numa map */
>  	while (fgets(buf, sizeof(buf), f) != NULL) {
> --
> 2.11.0

  parent reply	other threads:[~2019-03-11 10:08 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-08 18:08 Yongseok Koh
2019-03-08 18:09 ` [dpdk-stable] please check if patch 'net/cxgbe: fix macros related to logs for Windows' " Yongseok Koh
2019-03-10 10:13   ` Rahul Lakkireddy
2019-03-08 18:09 ` [dpdk-stable] please check if patch 'net/cxgbe: fix other misc build issues " Yongseok Koh
2019-03-10 10:13   ` Rahul Lakkireddy
2019-03-12 21:28     ` Yongseok Koh
2019-03-11 10:08 ` Burakov, Anatoly [this message]
2019-03-12 21:43   ` [dpdk-stable] please check if patch 'eal: fix strdup usages in internal config' " Yongseok Koh

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=C6ECDF3AB251BE4894318F4E4512369782EED6A1@IRSMSX107.ger.corp.intel.com \
    --to=anatoly.burakov@intel.com \
    --cc=stable@dpdk.org \
    --cc=yskoh@mellanox.com \
    /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).