From patchwork Fri Jul 5 09:31:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 142143 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id BD26E45594; Fri, 5 Jul 2024 11:35:08 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 974F042F8F; Fri, 5 Jul 2024 11:34:50 +0200 (CEST) Received: from szxga08-in.huawei.com (szxga08-in.huawei.com [45.249.212.255]) by mails.dpdk.org (Postfix) with ESMTP id 652EA42E9F for ; Fri, 5 Jul 2024 11:34:43 +0200 (CEST) Received: from mail.maildlp.com (unknown [172.19.88.105]) by szxga08-in.huawei.com (SkyGuard) with ESMTP id 4WFpC16jTyz1T4hf; Fri, 5 Jul 2024 17:30:05 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id CE21814011A; Fri, 5 Jul 2024 17:34:41 +0800 (CST) Received: from localhost.localdomain (10.50.165.33) by dggpeml500024.china.huawei.com (7.185.36.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Fri, 5 Jul 2024 17:34:41 +0800 From: Chengwen Feng To: CC: , , , Subject: [PATCH v2 1/4] cfgfile: remove dead code Date: Fri, 5 Jul 2024 09:31:12 +0000 Message-ID: <20240705093115.4437-2-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240705093115.4437-1-fengchengwen@huawei.com> References: <20240220035840.32978-1-fengchengwen@huawei.com> <20240705093115.4437-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To dggpeml500024.china.huawei.com (7.185.36.10) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org This memchr() will never return NULL because rte_cfgfile_load() function will skip lines without useful content. Fixes: 74e0d3a17461 ("cfgfile: fix null pointer dereference in parsing") Cc: stable@dpdk.org Signed-off-by: Chengwen Feng Acked-by: Stephen Hemminger --- lib/cfgfile/rte_cfgfile.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/cfgfile/rte_cfgfile.c b/lib/cfgfile/rte_cfgfile.c index 13ba3957bc..6a98e8fb11 100644 --- a/lib/cfgfile/rte_cfgfile.c +++ b/lib/cfgfile/rte_cfgfile.c @@ -223,12 +223,6 @@ rte_cfgfile_load_with_params(const char *filename, int flags, split[0] = buffer; split[1] = memchr(buffer, '=', len); - if (split[1] == NULL) { - CFG_LOG(ERR, - "line %d - no '=' character found", - lineno); - goto error1; - } *split[1] = '\0'; split[1]++; From patchwork Fri Jul 5 09:31:13 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 142140 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D1DE945594; Fri, 5 Jul 2024 11:34:45 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C098342ED0; Fri, 5 Jul 2024 11:34:45 +0200 (CEST) Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by mails.dpdk.org (Postfix) with ESMTP id E560C42E9F for ; Fri, 5 Jul 2024 11:34:43 +0200 (CEST) Received: from mail.maildlp.com (unknown [172.19.163.252]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4WFpC16ZxVzdZsj; Fri, 5 Jul 2024 17:30:05 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id 0197B180085; Fri, 5 Jul 2024 17:34:42 +0800 (CST) Received: from localhost.localdomain (10.50.165.33) by dggpeml500024.china.huawei.com (7.185.36.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Fri, 5 Jul 2024 17:34:41 +0800 From: Chengwen Feng To: CC: , , , Subject: [PATCH v2 2/4] cfgfile: support verify name and value Date: Fri, 5 Jul 2024 09:31:13 +0000 Message-ID: <20240705093115.4437-3-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240705093115.4437-1-fengchengwen@huawei.com> References: <20240220035840.32978-1-fengchengwen@huawei.com> <20240705093115.4437-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To dggpeml500024.china.huawei.com (7.185.36.10) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org This patch supports verify section's name, entry's name and entry's value validity. Cc: stable@dpdk.org Signed-off-by: Chengwen Feng Acked-by: Stephen Hemminger --- lib/cfgfile/rte_cfgfile.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/cfgfile/rte_cfgfile.c b/lib/cfgfile/rte_cfgfile.c index 6a98e8fb11..97a399635e 100644 --- a/lib/cfgfile/rte_cfgfile.c +++ b/lib/cfgfile/rte_cfgfile.c @@ -105,6 +105,16 @@ static int _add_entry(struct rte_cfgfile_section *section, const char *entryname, const char *entryvalue) { + int name_len, value_len; + + name_len = strlen(entryname); + value_len = strlen(entryvalue); + if (name_len == 0 || name_len >= CFG_NAME_LEN || value_len >= CFG_VALUE_LEN) { + CFG_LOG(ERR, "invalid entry name %s or value %s in section %s", + entryname, entryvalue, section->name); + return -EINVAL; + } + /* resize entry structure if we don't have room for more entries */ if (section->num_entries == section->allocated_entries) { struct rte_cfgfile_entry *n_entries = realloc( @@ -322,6 +332,7 @@ rte_cfgfile_create(int flags) int rte_cfgfile_add_section(struct rte_cfgfile *cfg, const char *sectionname) { + int len; int i; if (cfg == NULL) @@ -330,6 +341,12 @@ rte_cfgfile_add_section(struct rte_cfgfile *cfg, const char *sectionname) if (sectionname == NULL) return -EINVAL; + len = strlen(sectionname); + if (len == 0 || len >= CFG_NAME_LEN) { + CFG_LOG(ERR, "invalid section name %s", sectionname); + return -EINVAL; + } + /* resize overall struct if we don't have room for more sections */ if (cfg->num_sections == cfg->allocated_sections) { From patchwork Fri Jul 5 09:31:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 142141 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id ACB4245594; Fri, 5 Jul 2024 11:34:50 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CA3DA42F21; Fri, 5 Jul 2024 11:34:46 +0200 (CEST) Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) by mails.dpdk.org (Postfix) with ESMTP id E573B42ED0 for ; Fri, 5 Jul 2024 11:34:43 +0200 (CEST) Received: from mail.maildlp.com (unknown [172.19.163.17]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4WFpFd67hDz1HDyG; Fri, 5 Jul 2024 17:32:21 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id 1F2911A0188; Fri, 5 Jul 2024 17:34:42 +0800 (CST) Received: from localhost.localdomain (10.50.165.33) by dggpeml500024.china.huawei.com (7.185.36.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Fri, 5 Jul 2024 17:34:41 +0800 From: Chengwen Feng To: CC: , , , Subject: [PATCH v2 3/4] cfgfile: verify add section and entry result Date: Fri, 5 Jul 2024 09:31:14 +0000 Message-ID: <20240705093115.4437-4-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240705093115.4437-1-fengchengwen@huawei.com> References: <20240220035840.32978-1-fengchengwen@huawei.com> <20240705093115.4437-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To dggpeml500024.china.huawei.com (7.185.36.10) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The rte_cfgfile_add_section() and _add_entry()'s result were not verified, so that potential errors may not be detected. This commit adds the verification. Cc: stable@dpdk.org Signed-off-by: Chengwen Feng Acked-by: Stephen Hemminger --- lib/cfgfile/rte_cfgfile.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/cfgfile/rte_cfgfile.c b/lib/cfgfile/rte_cfgfile.c index 97a399635e..3033cff4a4 100644 --- a/lib/cfgfile/rte_cfgfile.c +++ b/lib/cfgfile/rte_cfgfile.c @@ -182,6 +182,7 @@ rte_cfgfile_load_with_params(const char *filename, int flags, char buffer[CFG_NAME_LEN + CFG_VALUE_LEN + 4]; int lineno = 0; struct rte_cfgfile *cfg; + int ret; if (rte_cfgfile_check_params(params)) return NULL; @@ -226,7 +227,9 @@ rte_cfgfile_load_with_params(const char *filename, int flags, *end = '\0'; _strip(&buffer[1], end - &buffer[1]); - rte_cfgfile_add_section(cfg, &buffer[1]); + ret = rte_cfgfile_add_section(cfg, &buffer[1]); + if (ret != 0) + goto error1; } else { /* key and value line */ char *split[2] = {NULL}; @@ -261,8 +264,10 @@ rte_cfgfile_load_with_params(const char *filename, int flags, if (cfg->num_sections == 0) goto error1; - _add_entry(&cfg->sections[cfg->num_sections - 1], - split[0], split[1]); + ret = _add_entry(&cfg->sections[cfg->num_sections - 1], + split[0], split[1]); + if (ret != 0) + goto error1; } } fclose(f); @@ -277,6 +282,7 @@ struct rte_cfgfile * rte_cfgfile_create(int flags) { int i; + int ret; struct rte_cfgfile *cfg; /* future proof flags usage */ @@ -310,8 +316,11 @@ rte_cfgfile_create(int flags) cfg->sections[i].allocated_entries = CFG_ALLOC_ENTRY_BATCH; } - if (flags & CFG_FLAG_GLOBAL_SECTION) - rte_cfgfile_add_section(cfg, "GLOBAL"); + if (flags & CFG_FLAG_GLOBAL_SECTION) { + ret = rte_cfgfile_add_section(cfg, "GLOBAL"); + if (ret != 0) + goto error1; + } return cfg; error1: From patchwork Fri Jul 5 09:31:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 142142 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id EF10045594; Fri, 5 Jul 2024 11:34:56 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0A73742F93; Fri, 5 Jul 2024 11:34:48 +0200 (CEST) Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) by mails.dpdk.org (Postfix) with ESMTP id 008AB42F05 for ; Fri, 5 Jul 2024 11:34:43 +0200 (CEST) Received: from mail.maildlp.com (unknown [172.19.88.163]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4WFpCZ2GhNz2Ckyh; Fri, 5 Jul 2024 17:30:34 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id 4769F18001B; Fri, 5 Jul 2024 17:34:42 +0800 (CST) Received: from localhost.localdomain (10.50.165.33) by dggpeml500024.china.huawei.com (7.185.36.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Fri, 5 Jul 2024 17:34:42 +0800 From: Chengwen Feng To: CC: , , , Subject: [PATCH v2 4/4] cfgfile: add strict parse flag Date: Fri, 5 Jul 2024 09:31:15 +0000 Message-ID: <20240705093115.4437-5-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240705093115.4437-1-fengchengwen@huawei.com> References: <20240220035840.32978-1-fengchengwen@huawei.com> <20240705093115.4437-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To dggpeml500024.china.huawei.com (7.185.36.10) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The cfgfile supports duplicate section name and entry name when parsing config file, which may confused and hard to debug when accidentally set duplicate name. So add strict parse flag, it will treat as error if encounter duplicate section name or entry name. Cc: stable@dpdk.org Signed-off-by: Chengwen Feng --- lib/cfgfile/rte_cfgfile.c | 32 +++++++++++++++++++++++--------- lib/cfgfile/rte_cfgfile.h | 7 +++++++ 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/lib/cfgfile/rte_cfgfile.c b/lib/cfgfile/rte_cfgfile.c index 3033cff4a4..5d96818728 100644 --- a/lib/cfgfile/rte_cfgfile.c +++ b/lib/cfgfile/rte_cfgfile.c @@ -102,8 +102,8 @@ _get_section(struct rte_cfgfile *cfg, const char *sectionname) } static int -_add_entry(struct rte_cfgfile_section *section, const char *entryname, - const char *entryvalue) +_add_entry(struct rte_cfgfile *cfg, struct rte_cfgfile_section *section, + const char *entryname, const char *entryvalue, bool check_dup) { int name_len, value_len; @@ -115,6 +115,14 @@ _add_entry(struct rte_cfgfile_section *section, const char *entryname, return -EINVAL; } + if (check_dup) { + if (rte_cfgfile_has_entry(cfg, section->name, entryname) != 0) { + CFG_LOG(ERR, "duplicate entry name %s in section %s", + entryname, section->name); + return -EEXIST; + } + } + /* resize entry structure if we don't have room for more entries */ if (section->num_entries == section->allocated_entries) { struct rte_cfgfile_entry *n_entries = realloc( @@ -264,8 +272,9 @@ rte_cfgfile_load_with_params(const char *filename, int flags, if (cfg->num_sections == 0) goto error1; - ret = _add_entry(&cfg->sections[cfg->num_sections - 1], - split[0], split[1]); + ret = _add_entry(cfg, &cfg->sections[cfg->num_sections - 1], + split[0], split[1], + !!(flags & CFG_FLAG_STRICT_PARSE)); if (ret != 0) goto error1; } @@ -286,7 +295,8 @@ rte_cfgfile_create(int flags) struct rte_cfgfile *cfg; /* future proof flags usage */ - if (flags & ~(CFG_FLAG_GLOBAL_SECTION | CFG_FLAG_EMPTY_VALUES)) + if (flags & ~(CFG_FLAG_GLOBAL_SECTION | CFG_FLAG_EMPTY_VALUES | + CFG_FLAG_STRICT_PARSE)) return NULL; cfg = malloc(sizeof(*cfg)); @@ -356,6 +366,13 @@ rte_cfgfile_add_section(struct rte_cfgfile *cfg, const char *sectionname) return -EINVAL; } + if (cfg->flags & CFG_FLAG_STRICT_PARSE) { + if (rte_cfgfile_has_section(cfg, sectionname) != 0) { + CFG_LOG(ERR, "duplicate section name %s", sectionname); + return -EEXIST; + } + } + /* resize overall struct if we don't have room for more sections */ if (cfg->num_sections == cfg->allocated_sections) { @@ -396,16 +413,13 @@ int rte_cfgfile_add_entry(struct rte_cfgfile *cfg, || (entryvalue == NULL)) return -EINVAL; - if (rte_cfgfile_has_entry(cfg, sectionname, entryname) != 0) - return -EEXIST; - /* search for section pointer by sectionname */ struct rte_cfgfile_section *curr_section = _get_section(cfg, sectionname); if (curr_section == NULL) return -EINVAL; - ret = _add_entry(curr_section, entryname, entryvalue); + ret = _add_entry(cfg, curr_section, entryname, entryvalue, true); return ret; } diff --git a/lib/cfgfile/rte_cfgfile.h b/lib/cfgfile/rte_cfgfile.h index 232c65c77b..b3c50cdfb2 100644 --- a/lib/cfgfile/rte_cfgfile.h +++ b/lib/cfgfile/rte_cfgfile.h @@ -56,6 +56,13 @@ enum { * be zero length (e.g., "key="). */ CFG_FLAG_EMPTY_VALUES = 2, + + /** + * Indicates that the parser will not allow for any section and entry + * duplicates. If a duplicated section or entry is detected, the + * operation will return error. + */ + CFG_FLAG_STRICT_PARSE = 4, }; /**@} */