From patchwork Tue Feb 20 03:58:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 136885 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 BFD3443AD8; Tue, 20 Feb 2024 05:00:19 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 73A124064A; Tue, 20 Feb 2024 05:00:11 +0100 (CET) Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) by mails.dpdk.org (Postfix) with ESMTP id B91EC402B8 for ; Tue, 20 Feb 2024 05:00:07 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.163.17]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4Tf5GY4SW5z2BdDS; Tue, 20 Feb 2024 11:57:57 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id 5D96D1A0172; Tue, 20 Feb 2024 12:00:05 +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_128_GCM_SHA256) id 15.1.2507.35; Tue, 20 Feb 2024 12:00:05 +0800 From: Chengwen Feng To: CC: , Subject: [PATCH 1/4] cfgfile: remove dead code Date: Tue, 20 Feb 2024 03:58:37 +0000 Message-ID: <20240220035840.32978-2-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240220035840.32978-1-fengchengwen@huawei.com> References: <20240220035840.32978-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) 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 --- 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 6a5e4fd942..d7aa38b56f 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 Tue Feb 20 03:58:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 136886 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 9D59243AD8; Tue, 20 Feb 2024 05:00:28 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 083E4406BC; Tue, 20 Feb 2024 05:00:13 +0100 (CET) Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) by mails.dpdk.org (Postfix) with ESMTP id B40684067E for ; Tue, 20 Feb 2024 05:00:11 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.163.17]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4Tf5CW0jLlz1FL5M; Tue, 20 Feb 2024 11:55:19 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id 8A2EA1A0172; Tue, 20 Feb 2024 12:00:05 +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_128_GCM_SHA256) id 15.1.2507.35; Tue, 20 Feb 2024 12:00:05 +0800 From: Chengwen Feng To: CC: , Subject: [PATCH 2/4] cfgfile: support verify name and value Date: Tue, 20 Feb 2024 03:58:38 +0000 Message-ID: <20240220035840.32978-3-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240220035840.32978-1-fengchengwen@huawei.com> References: <20240220035840.32978-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) 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 --- 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 d7aa38b56f..6f8f46a406 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 Tue Feb 20 03:58:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 136884 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 BD97643AD8; Tue, 20 Feb 2024 05:00:13 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4B9ED402DE; Tue, 20 Feb 2024 05:00:10 +0100 (CET) Received: from szxga06-in.huawei.com (szxga06-in.huawei.com [45.249.212.32]) by mails.dpdk.org (Postfix) with ESMTP id 8AED04029B for ; Tue, 20 Feb 2024 05:00:07 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.163.44]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4Tf5JN0Fw4zqjkB; Tue, 20 Feb 2024 11:59:32 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id A0EB31400DB; Tue, 20 Feb 2024 12:00:05 +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_128_GCM_SHA256) id 15.1.2507.35; Tue, 20 Feb 2024 12:00:05 +0800 From: Chengwen Feng To: CC: , Subject: [PATCH 3/4] cfgfile: verify add section and entry result Date: Tue, 20 Feb 2024 03:58:39 +0000 Message-ID: <20240220035840.32978-4-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240220035840.32978-1-fengchengwen@huawei.com> References: <20240220035840.32978-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) 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 --- 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 6f8f46a406..ad9314dc14 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 Tue Feb 20 03:58:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 136887 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 62ED543AD8; Tue, 20 Feb 2024 05:00:35 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2B5C24069F; Tue, 20 Feb 2024 05:00:15 +0100 (CET) Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) by mails.dpdk.org (Postfix) with ESMTP id 0DACA40691 for ; Tue, 20 Feb 2024 05:00:12 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.163.17]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4Tf5CW0ddDz1FL5V; Tue, 20 Feb 2024 11:55:19 +0800 (CST) Received: from dggpeml500024.china.huawei.com (unknown [7.185.36.10]) by mail.maildlp.com (Postfix) with ESMTPS id C11911A0178; Tue, 20 Feb 2024 12:00:05 +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_128_GCM_SHA256) id 15.1.2507.35; Tue, 20 Feb 2024 12:00:05 +0800 From: Chengwen Feng To: CC: , Subject: [PATCH 4/4] cfgfile: add unique name flag Date: Tue, 20 Feb 2024 03:58:40 +0000 Message-ID: <20240220035840.32978-5-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20240220035840.32978-1-fengchengwen@huawei.com> References: <20240220035840.32978-1-fengchengwen@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.50.165.33] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) 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 unique name 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 ad9314dc14..9e901b0977 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_UNIQUE_NAME)); 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_UNIQUE_NAME)) 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_UNIQUE_NAME) { + 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..74057c1b73 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 file should have unique section name AND unique + * entry's name. If a duplicate name is detected, the operation will + * return error. + */ + CFG_FLAG_UNIQUE_NAME = 4, }; /**@} */