From: Yongseok Koh <yskoh@mellanox.com>
To: "Burakov, Anatoly" <anatoly.burakov@intel.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: Tue, 12 Mar 2019 21:43:31 +0000 [thread overview]
Message-ID: <294E8C7A-0DD7-45DF-B74C-4BE6FC35CA7E@mellanox.com> (raw)
In-Reply-To: <C6ECDF3AB251BE4894318F4E4512369782EED6A1@IRSMSX107.ger.corp.intel.com>
Okay will not merge it then.
Thanks,
Yongseok
> On Mar 11, 2019, at 3:08 AM, Burakov, Anatoly <anatoly.burakov@intel.com> wrote:
>
> 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: https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fdpdk.org%2Fbrowse%2Fdpdk-&data=02%7C01%7Cyskoh%40mellanox.com%7C3d7486372a674d3f22a108d6a60974d8%7Ca652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C636878956887750739&sdata=kYJAXumgJWJqqb%2BUSAkXdBusXo%2FEp%2FqL25txtHXH%2FHs%3D&reserved=0
>> 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
prev parent reply other threads:[~2019-03-12 21:43 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 ` [dpdk-stable] please check if patch 'eal: fix strdup usages in internal config' " Burakov, Anatoly
2019-03-12 21:43 ` Yongseok Koh [this message]
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=294E8C7A-0DD7-45DF-B74C-4BE6FC35CA7E@mellanox.com \
--to=yskoh@mellanox.com \
--cc=anatoly.burakov@intel.com \
--cc=stable@dpdk.org \
/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).