DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH 0/4] cfgfile: enhance error detecting
@ 2024-02-20  3:58 Chengwen Feng
  2024-02-20  3:58 ` [PATCH 1/4] cfgfile: remove dead code Chengwen Feng
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Chengwen Feng @ 2024-02-20  3:58 UTC (permalink / raw)
  To: thomas; +Cc: dev, cristian.dumitrescu

When I was trying to debug a problem introduced by config.ini in
test-dma-perf, I found the cfgfile library should enhance error
detecting, so got this patchset.

Chengwen Feng (4):
  cfgfile: remove dead code
  cfgfile: support verify name and value
  cfgfile: verify add section and entry result
  cfgfile: add unique name flag

 lib/cfgfile/rte_cfgfile.c | 70 +++++++++++++++++++++++++++++----------
 lib/cfgfile/rte_cfgfile.h |  7 ++++
 2 files changed, 59 insertions(+), 18 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/4] cfgfile: remove dead code
  2024-02-20  3:58 [PATCH 0/4] cfgfile: enhance error detecting Chengwen Feng
@ 2024-02-20  3:58 ` Chengwen Feng
  2024-02-20  3:58 ` [PATCH 2/4] cfgfile: support verify name and value Chengwen Feng
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Chengwen Feng @ 2024-02-20  3:58 UTC (permalink / raw)
  To: thomas; +Cc: dev, cristian.dumitrescu

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 <fengchengwen@huawei.com>
---
 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]++;
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 2/4] cfgfile: support verify name and value
  2024-02-20  3:58 [PATCH 0/4] cfgfile: enhance error detecting Chengwen Feng
  2024-02-20  3:58 ` [PATCH 1/4] cfgfile: remove dead code Chengwen Feng
@ 2024-02-20  3:58 ` Chengwen Feng
  2024-02-20  3:58 ` [PATCH 3/4] cfgfile: verify add section and entry result Chengwen Feng
  2024-02-20  3:58 ` [PATCH 4/4] cfgfile: add unique name flag Chengwen Feng
  3 siblings, 0 replies; 5+ messages in thread
From: Chengwen Feng @ 2024-02-20  3:58 UTC (permalink / raw)
  To: thomas; +Cc: dev, cristian.dumitrescu

This patch supports verify section's name, entry's name and entry's
value validity.

Cc: stable@dpdk.org

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
---
 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) {
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 3/4] cfgfile: verify add section and entry result
  2024-02-20  3:58 [PATCH 0/4] cfgfile: enhance error detecting Chengwen Feng
  2024-02-20  3:58 ` [PATCH 1/4] cfgfile: remove dead code Chengwen Feng
  2024-02-20  3:58 ` [PATCH 2/4] cfgfile: support verify name and value Chengwen Feng
@ 2024-02-20  3:58 ` Chengwen Feng
  2024-02-20  3:58 ` [PATCH 4/4] cfgfile: add unique name flag Chengwen Feng
  3 siblings, 0 replies; 5+ messages in thread
From: Chengwen Feng @ 2024-02-20  3:58 UTC (permalink / raw)
  To: thomas; +Cc: dev, cristian.dumitrescu

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 <fengchengwen@huawei.com>
---
 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:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 4/4] cfgfile: add unique name flag
  2024-02-20  3:58 [PATCH 0/4] cfgfile: enhance error detecting Chengwen Feng
                   ` (2 preceding siblings ...)
  2024-02-20  3:58 ` [PATCH 3/4] cfgfile: verify add section and entry result Chengwen Feng
@ 2024-02-20  3:58 ` Chengwen Feng
  3 siblings, 0 replies; 5+ messages in thread
From: Chengwen Feng @ 2024-02-20  3:58 UTC (permalink / raw)
  To: thomas; +Cc: dev, cristian.dumitrescu

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 <fengchengwen@huawei.com>
---
 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,
 };
 /**@} */
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-02-20  4:00 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-20  3:58 [PATCH 0/4] cfgfile: enhance error detecting Chengwen Feng
2024-02-20  3:58 ` [PATCH 1/4] cfgfile: remove dead code Chengwen Feng
2024-02-20  3:58 ` [PATCH 2/4] cfgfile: support verify name and value Chengwen Feng
2024-02-20  3:58 ` [PATCH 3/4] cfgfile: verify add section and entry result Chengwen Feng
2024-02-20  3:58 ` [PATCH 4/4] cfgfile: add unique name flag Chengwen Feng

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).