* [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 ` (6 more replies) 0 siblings, 7 replies; 22+ 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] 22+ 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-07-04 21:28 ` Stephen Hemminger 2024-02-20 3:58 ` [PATCH 2/4] cfgfile: support verify name and value Chengwen Feng ` (5 subsequent siblings) 6 siblings, 1 reply; 22+ 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] 22+ messages in thread
* Re: [PATCH 1/4] cfgfile: remove dead code 2024-02-20 3:58 ` [PATCH 1/4] cfgfile: remove dead code Chengwen Feng @ 2024-07-04 21:28 ` Stephen Hemminger 0 siblings, 0 replies; 22+ messages in thread From: Stephen Hemminger @ 2024-07-04 21:28 UTC (permalink / raw) To: Chengwen Feng; +Cc: thomas, dev, cristian.dumitrescu On Tue, 20 Feb 2024 03:58:37 +0000 Chengwen Feng <fengchengwen@huawei.com> wrote: > 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> LGTM Acked-by: Stephen Hemminger <stephen@networkplumber.org> ^ permalink raw reply [flat|nested] 22+ 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-07-04 21:29 ` Stephen Hemminger 2024-02-20 3:58 ` [PATCH 3/4] cfgfile: verify add section and entry result Chengwen Feng ` (4 subsequent siblings) 6 siblings, 1 reply; 22+ 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] 22+ messages in thread
* Re: [PATCH 2/4] cfgfile: support verify name and value 2024-02-20 3:58 ` [PATCH 2/4] cfgfile: support verify name and value Chengwen Feng @ 2024-07-04 21:29 ` Stephen Hemminger 0 siblings, 0 replies; 22+ messages in thread From: Stephen Hemminger @ 2024-07-04 21:29 UTC (permalink / raw) To: Chengwen Feng; +Cc: thomas, dev, cristian.dumitrescu On Tue, 20 Feb 2024 03:58:38 +0000 Chengwen Feng <fengchengwen@huawei.com> wrote: > 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> Acked-by: Stephen Hemminger <stephen@networkplumber.org> ^ permalink raw reply [flat|nested] 22+ 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-07-04 21:30 ` Stephen Hemminger 2024-02-20 3:58 ` [PATCH 4/4] cfgfile: add unique name flag Chengwen Feng ` (3 subsequent siblings) 6 siblings, 1 reply; 22+ 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] 22+ messages in thread
* Re: [PATCH 3/4] cfgfile: verify add section and entry result 2024-02-20 3:58 ` [PATCH 3/4] cfgfile: verify add section and entry result Chengwen Feng @ 2024-07-04 21:30 ` Stephen Hemminger 0 siblings, 0 replies; 22+ messages in thread From: Stephen Hemminger @ 2024-07-04 21:30 UTC (permalink / raw) To: Chengwen Feng; +Cc: thomas, dev, cristian.dumitrescu On Tue, 20 Feb 2024 03:58:39 +0000 Chengwen Feng <fengchengwen@huawei.com> wrote: > 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> Should add more tests as well. Acked-by: Stephen Hemminger <stephen@networkplumber.org> ^ permalink raw reply [flat|nested] 22+ 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 2024-07-04 21:36 ` Stephen Hemminger 2024-07-04 15:12 ` [PATCH 0/4] cfgfile: enhance error detecting David Marchand ` (2 subsequent siblings) 6 siblings, 1 reply; 22+ 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] 22+ messages in thread
* Re: [PATCH 4/4] cfgfile: add unique name flag 2024-02-20 3:58 ` [PATCH 4/4] cfgfile: add unique name flag Chengwen Feng @ 2024-07-04 21:36 ` Stephen Hemminger 2024-07-05 9:37 ` fengchengwen 0 siblings, 1 reply; 22+ messages in thread From: Stephen Hemminger @ 2024-07-04 21:36 UTC (permalink / raw) To: Chengwen Feng; +Cc: thomas, dev, cristian.dumitrescu On Tue, 20 Feb 2024 03:58:40 +0000 Chengwen Feng <fengchengwen@huawei.com> wrote: > 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> https://en.wikipedia.org/wiki/INI_file Interpretation of multiple section declarations with the same name also varies. In some implementations, duplicate sections simply merge their properties, as if they occurred contiguously. Others may abort, or ignore some aspect of the INI file. The standard reference for INI file parsing on Linux is the Python configparser https://docs.python.org/3/library/configparser.html strict, default value: True When set to True, the parser will not allow for any section or option duplicates while reading from a single source (using read_file(), read_string() or read_dict()). It is recommended to use strict parsers in new applications. The problem I see is that cfgfile allows duplicates on names, and sections. Perhaps there should be a new strict flag for this. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 4/4] cfgfile: add unique name flag 2024-07-04 21:36 ` Stephen Hemminger @ 2024-07-05 9:37 ` fengchengwen 0 siblings, 0 replies; 22+ messages in thread From: fengchengwen @ 2024-07-05 9:37 UTC (permalink / raw) To: Stephen Hemminger; +Cc: thomas, dev, cristian.dumitrescu Hi Stephen, On 2024/7/5 5:36, Stephen Hemminger wrote: > On Tue, 20 Feb 2024 03:58:40 +0000 > Chengwen Feng <fengchengwen@huawei.com> wrote: > >> 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> > > https://en.wikipedia.org/wiki/INI_file > > Interpretation of multiple section declarations with the same name also varies. > In some implementations, duplicate sections simply merge their properties, as if > they occurred contiguously. Others may abort, or ignore some aspect of the INI file. > > The standard reference for INI file parsing on Linux is the Python configparser > https://docs.python.org/3/library/configparser.html > > strict, default value: True > > When set to True, the parser will not allow for any section or option duplicates while reading from a single source (using read_file(), read_string() or read_dict()). It is recommended to use strict parsers in new applications. > > The problem I see is that cfgfile allows duplicates on names, and sections. > Perhaps there should be a new strict flag for this. It is important to keep the naming consistent, already sent v2 to fix it. Thanks > . > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 0/4] cfgfile: enhance error detecting 2024-02-20 3:58 [PATCH 0/4] cfgfile: enhance error detecting Chengwen Feng ` (3 preceding siblings ...) 2024-02-20 3:58 ` [PATCH 4/4] cfgfile: add unique name flag Chengwen Feng @ 2024-07-04 15:12 ` David Marchand 2024-07-05 0:14 ` Stephen Hemminger 2024-07-04 21:40 ` Stephen Hemminger 2024-07-05 9:31 ` [PATCH v2 " Chengwen Feng 6 siblings, 1 reply; 22+ messages in thread From: David Marchand @ 2024-07-04 15:12 UTC (permalink / raw) To: cristian.dumitrescu; +Cc: thomas, dev, Chengwen Feng On Tue, Feb 20, 2024 at 5:00 AM Chengwen Feng <fengchengwen@huawei.com> wrote: > > 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(-) Please review. -- David Marchand ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 0/4] cfgfile: enhance error detecting 2024-07-04 15:12 ` [PATCH 0/4] cfgfile: enhance error detecting David Marchand @ 2024-07-05 0:14 ` Stephen Hemminger 2024-07-05 0:29 ` Stephen Hemminger 0 siblings, 1 reply; 22+ messages in thread From: Stephen Hemminger @ 2024-07-05 0:14 UTC (permalink / raw) To: David Marchand; +Cc: cristian.dumitrescu, thomas, dev, Chengwen Feng On Thu, 4 Jul 2024 17:12:56 +0200 David Marchand <david.marchand@redhat.com> wrote: > On Tue, Feb 20, 2024 at 5:00 AM Chengwen Feng <fengchengwen@huawei.com> wrote: > > > > 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(-) > > Please review. > > Somewhat related, why is the cfgfile test disabled? The line for test_cfgfile is commented out in app/test/meson.build ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 0/4] cfgfile: enhance error detecting 2024-07-05 0:14 ` Stephen Hemminger @ 2024-07-05 0:29 ` Stephen Hemminger 0 siblings, 0 replies; 22+ messages in thread From: Stephen Hemminger @ 2024-07-05 0:29 UTC (permalink / raw) To: David Marchand, Cristian Dumitrescu Cc: cristian.dumitrescu, thomas, dev, Chengwen Feng On Thu, 4 Jul 2024 17:14:33 -0700 Stephen Hemminger <stephen@networkplumber.org> wrote: > On Thu, 4 Jul 2024 17:12:56 +0200 > David Marchand <david.marchand@redhat.com> wrote: > > > On Tue, Feb 20, 2024 at 5:00 AM Chengwen Feng <fengchengwen@huawei.com> wrote: > > > > > > 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(-) > > > > Please review. > > > > > > > Somewhat related, why is the cfgfile test disabled? > The line for test_cfgfile is commented out in app/test/meson.build The existing test won't build because of broken resource stuff which is also not built. Probably best to yank the whole test and resource stuff out until Christian fixes it. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 0/4] cfgfile: enhance error detecting 2024-02-20 3:58 [PATCH 0/4] cfgfile: enhance error detecting Chengwen Feng ` (4 preceding siblings ...) 2024-07-04 15:12 ` [PATCH 0/4] cfgfile: enhance error detecting David Marchand @ 2024-07-04 21:40 ` Stephen Hemminger 2024-07-05 8:39 ` Bruce Richardson 2024-07-05 9:31 ` [PATCH v2 " Chengwen Feng 6 siblings, 1 reply; 22+ messages in thread From: Stephen Hemminger @ 2024-07-04 21:40 UTC (permalink / raw) To: Chengwen Feng; +Cc: thomas, dev, cristian.dumitrescu On Tue, 20 Feb 2024 03:58:36 +0000 Chengwen Feng <fengchengwen@huawei.com> wrote: > 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(-) > The existing cfgfile in DPDK is quite limited, and there are better libraries available; not sure why a reinvention was necessary. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 0/4] cfgfile: enhance error detecting 2024-07-04 21:40 ` Stephen Hemminger @ 2024-07-05 8:39 ` Bruce Richardson 0 siblings, 0 replies; 22+ messages in thread From: Bruce Richardson @ 2024-07-05 8:39 UTC (permalink / raw) To: Stephen Hemminger; +Cc: Chengwen Feng, thomas, dev, cristian.dumitrescu On Thu, Jul 04, 2024 at 02:40:55PM -0700, Stephen Hemminger wrote: > On Tue, 20 Feb 2024 03:58:36 +0000 > Chengwen Feng <fengchengwen@huawei.com> wrote: > > > 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(-) > > > > > The existing cfgfile in DPDK is quite limited, and there are better > libraries available; not sure why a reinvention was necessary. > At the time, it was done to avoid having additional external dependencies. Since then, it's generally been relatively trouble free, so it's never been felt worth the effort to replace, I suspect. /Bruce ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v2 0/4] cfgfile: enhance error detecting 2024-02-20 3:58 [PATCH 0/4] cfgfile: enhance error detecting Chengwen Feng ` (5 preceding siblings ...) 2024-07-04 21:40 ` Stephen Hemminger @ 2024-07-05 9:31 ` Chengwen Feng 2024-07-05 9:31 ` [PATCH v2 1/4] cfgfile: remove dead code Chengwen Feng ` (5 more replies) 6 siblings, 6 replies; 22+ messages in thread From: Chengwen Feng @ 2024-07-05 9:31 UTC (permalink / raw) To: thomas; +Cc: dev, cristian.dumitrescu, stephen, david.marchand 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 strict parse flag --- v2: replace unique name with strict parse flag which address Stephen's comment. 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] 22+ messages in thread
* [PATCH v2 1/4] cfgfile: remove dead code 2024-07-05 9:31 ` [PATCH v2 " Chengwen Feng @ 2024-07-05 9:31 ` Chengwen Feng 2024-07-05 9:31 ` [PATCH v2 2/4] cfgfile: support verify name and value Chengwen Feng ` (4 subsequent siblings) 5 siblings, 0 replies; 22+ messages in thread From: Chengwen Feng @ 2024-07-05 9:31 UTC (permalink / raw) To: thomas; +Cc: dev, cristian.dumitrescu, stephen, david.marchand 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> Acked-by: Stephen Hemminger <stephen@networkplumber.org> --- 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]++; -- 2.17.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v2 2/4] cfgfile: support verify name and value 2024-07-05 9:31 ` [PATCH v2 " Chengwen Feng 2024-07-05 9:31 ` [PATCH v2 1/4] cfgfile: remove dead code Chengwen Feng @ 2024-07-05 9:31 ` Chengwen Feng 2024-07-05 9:31 ` [PATCH v2 3/4] cfgfile: verify add section and entry result Chengwen Feng ` (3 subsequent siblings) 5 siblings, 0 replies; 22+ messages in thread From: Chengwen Feng @ 2024-07-05 9:31 UTC (permalink / raw) To: thomas; +Cc: dev, cristian.dumitrescu, stephen, david.marchand 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> Acked-by: Stephen Hemminger <stephen@networkplumber.org> --- 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) { -- 2.17.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v2 3/4] cfgfile: verify add section and entry result 2024-07-05 9:31 ` [PATCH v2 " Chengwen Feng 2024-07-05 9:31 ` [PATCH v2 1/4] cfgfile: remove dead code Chengwen Feng 2024-07-05 9:31 ` [PATCH v2 2/4] cfgfile: support verify name and value Chengwen Feng @ 2024-07-05 9:31 ` Chengwen Feng 2024-07-05 9:31 ` [PATCH v2 4/4] cfgfile: add strict parse flag Chengwen Feng ` (2 subsequent siblings) 5 siblings, 0 replies; 22+ messages in thread From: Chengwen Feng @ 2024-07-05 9:31 UTC (permalink / raw) To: thomas; +Cc: dev, cristian.dumitrescu, stephen, david.marchand 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> Acked-by: Stephen Hemminger <stephen@networkplumber.org> --- 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: -- 2.17.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v2 4/4] cfgfile: add strict parse flag 2024-07-05 9:31 ` [PATCH v2 " Chengwen Feng ` (2 preceding siblings ...) 2024-07-05 9:31 ` [PATCH v2 3/4] cfgfile: verify add section and entry result Chengwen Feng @ 2024-07-05 9:31 ` Chengwen Feng 2024-09-06 1:03 ` [PATCH v2 0/4] cfgfile: enhance error detecting fengchengwen 2024-10-09 22:47 ` Stephen Hemminger 5 siblings, 0 replies; 22+ messages in thread From: Chengwen Feng @ 2024-07-05 9:31 UTC (permalink / raw) To: thomas; +Cc: dev, cristian.dumitrescu, stephen, david.marchand 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 <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 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, }; /**@} */ -- 2.17.1 ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v2 0/4] cfgfile: enhance error detecting 2024-07-05 9:31 ` [PATCH v2 " Chengwen Feng ` (3 preceding siblings ...) 2024-07-05 9:31 ` [PATCH v2 4/4] cfgfile: add strict parse flag Chengwen Feng @ 2024-09-06 1:03 ` fengchengwen 2024-10-09 22:47 ` Stephen Hemminger 5 siblings, 0 replies; 22+ messages in thread From: fengchengwen @ 2024-09-06 1:03 UTC (permalink / raw) To: thomas; +Cc: dev, cristian.dumitrescu, stephen, david.marchand Kindly ping Thanks On 2024/7/5 17:31, Chengwen Feng wrote: > 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 strict parse flag > > --- > v2: replace unique name with strict parse flag which address Stephen's > comment. > > lib/cfgfile/rte_cfgfile.c | 70 +++++++++++++++++++++++++++++---------- > lib/cfgfile/rte_cfgfile.h | 7 ++++ > 2 files changed, 59 insertions(+), 18 deletions(-) > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v2 0/4] cfgfile: enhance error detecting 2024-07-05 9:31 ` [PATCH v2 " Chengwen Feng ` (4 preceding siblings ...) 2024-09-06 1:03 ` [PATCH v2 0/4] cfgfile: enhance error detecting fengchengwen @ 2024-10-09 22:47 ` Stephen Hemminger 5 siblings, 0 replies; 22+ messages in thread From: Stephen Hemminger @ 2024-10-09 22:47 UTC (permalink / raw) To: Chengwen Feng; +Cc: thomas, dev, cristian.dumitrescu, david.marchand On Fri, 5 Jul 2024 09:31:11 +0000 Chengwen Feng <fengchengwen@huawei.com> wrote: > 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 strict parse flag > > --- > v2: replace unique name with strict parse flag which address Stephen's > comment. > > lib/cfgfile/rte_cfgfile.c | 70 +++++++++++++++++++++++++++++---------- > lib/cfgfile/rte_cfgfile.h | 7 ++++ > 2 files changed, 59 insertions(+), 18 deletions(-) > This patch series is good, but a few things are needed still: - please add a functional test for this. - add a release note, since somebody might get be surprised. Also, would be good to put DPDK cfgfile parser on the Wikipedia page about ini files? This library could really use some work: - support variable length (not fixed size strings) - support multi-line - sub sections - faster access for large ini files (not linked list) ^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2024-10-09 22:47 UTC | newest] Thread overview: 22+ 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-07-04 21:28 ` Stephen Hemminger 2024-02-20 3:58 ` [PATCH 2/4] cfgfile: support verify name and value Chengwen Feng 2024-07-04 21:29 ` Stephen Hemminger 2024-02-20 3:58 ` [PATCH 3/4] cfgfile: verify add section and entry result Chengwen Feng 2024-07-04 21:30 ` Stephen Hemminger 2024-02-20 3:58 ` [PATCH 4/4] cfgfile: add unique name flag Chengwen Feng 2024-07-04 21:36 ` Stephen Hemminger 2024-07-05 9:37 ` fengchengwen 2024-07-04 15:12 ` [PATCH 0/4] cfgfile: enhance error detecting David Marchand 2024-07-05 0:14 ` Stephen Hemminger 2024-07-05 0:29 ` Stephen Hemminger 2024-07-04 21:40 ` Stephen Hemminger 2024-07-05 8:39 ` Bruce Richardson 2024-07-05 9:31 ` [PATCH v2 " Chengwen Feng 2024-07-05 9:31 ` [PATCH v2 1/4] cfgfile: remove dead code Chengwen Feng 2024-07-05 9:31 ` [PATCH v2 2/4] cfgfile: support verify name and value Chengwen Feng 2024-07-05 9:31 ` [PATCH v2 3/4] cfgfile: verify add section and entry result Chengwen Feng 2024-07-05 9:31 ` [PATCH v2 4/4] cfgfile: add strict parse flag Chengwen Feng 2024-09-06 1:03 ` [PATCH v2 0/4] cfgfile: enhance error detecting fengchengwen 2024-10-09 22:47 ` Stephen Hemminger
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).