diff options
author | Corubba Smith <corubba@gmx.de> | 2025-03-12 20:09:36 +0100 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2025-03-12 20:11:22 +0100 |
commit | 1b4e27768b375e646528a1b622391a95f8c25b25 (patch) | |
tree | db4a3efd53086a3b6d25d4dea8ec87dbaf9e1d09 | |
parent | 15b89e41a5365adf81a6f2b70fbd733f0343c91b (diff) |
ulogd: raise error on unknown config key
Until a6fbeb96e889 ("new configuration file syntax (Magnus Boden)")
this was already caught, and the enum member is still present.
Check if the for loop worked throught the whole array without hitting a
matching config option, and return with the unknown key error code.
Because there is no existing config_entry struct with that unknwon key
to use with the established config_errce pointer, allocate a new struct.
This potentially creates a memory leak if that config_entry is never
freed again, but for me that is acceptable in this rare case.
Since the memory allocation for the struct can fail, also reuse the old
out-of-memory error to indicate that.
Signed-off-by: Corubba Smith <corubba@gmx.de>
Signed-off-by: Florian Westphal <fw@strlen.de>
-rw-r--r-- | src/conffile.c | 12 | ||||
-rw-r--r-- | src/ulogd.c | 2 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/conffile.c b/src/conffile.c index e55ff30..f84fcf5 100644 --- a/src/conffile.c +++ b/src/conffile.c @@ -256,6 +256,18 @@ int config_parse_file(const char *section, struct config_keyset *kset) break; } pr_debug("parse_file: exiting main loop\n"); + + if (i == kset->num_ces) { + config_errce = calloc(1, sizeof(struct config_entry)); + if (config_errce == NULL) { + err = -ERROOM; + goto cpf_error; + } + memcpy(&config_errce->key[0], wordbuf, + sizeof(config_errce->key) - 1); + err = -ERRUNKN; + goto cpf_error; + } } diff --git a/src/ulogd.c b/src/ulogd.c index b146f94..917ae3a 100644 --- a/src/ulogd.c +++ b/src/ulogd.c @@ -281,6 +281,8 @@ int ulogd_parse_configfile(const char *section, struct config_keyset *ce) case -ERRUNKN: ulogd_log(ULOGD_ERROR, "unknown config key \"%s\"\n", config_errce->key); + free(config_errce); + config_errce = NULL; break; case -ERRSECTION: ulogd_log(ULOGD_ERROR, "section \"%s\" not found\n", section); |