From 9b232e07f9b24a16d496939ec44c37fb772cd0b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 21 Nov 2021 10:55:57 +0100 Subject: [PATCH] config: create a copy of the section name The parsing context keeps a pointer to the current section name. This is used when logging errors. However, the pointer was into a buffer allocated by getline(). This buffer are often re-used in the next call to getline(), or free:d. Regardless, the section name pointer is invalid after the next call to getline(), which meant all error messages were logging a correct section name. --- CHANGELOG.md | 1 + config.c | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b65f0b63..1f7208d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ * Regression: `letter-spacing` resulting in a “not a valid option” error (https://codeberg.org/dnkl/foot/issues/795). +* Regression: bad section name in configuration error messages. ### Security diff --git a/config.c b/config.c index 24ed1267..fdca96cd 100644 --- a/config.c +++ b/config.c @@ -2469,9 +2469,11 @@ parse_config_file(FILE *f, struct config *conf, const char *path, bool errors_ar continue; \ } + char *section_name = xstrdup("main"); + struct context context = { .conf = conf, - .section = "main", + .section = section_name, .path = path, .lineno = 0, .errors_are_fatal = errors_are_fatal, @@ -2539,7 +2541,9 @@ parse_config_file(FILE *f, struct config *conf, const char *path, bool errors_ar error_or_continue(); } - context.section = &key_value[1]; + free(section_name); + section_name = xstrdup(&key_value[1]); + context.section = section_name; /* Process next line */ continue; @@ -2569,10 +2573,12 @@ parse_config_file(FILE *f, struct config *conf, const char *path, bool errors_ar error_or_continue(); } + free(section_name); free(_line); return true; err: + free(section_name); free(_line); return false; }