From 1e863efba1c8d44b1f4faa8334a2c6ffb40e951c Mon Sep 17 00:00:00 2001 From: Phil Jones Date: Thu, 24 Nov 2022 14:55:47 +0000 Subject: Fix more potential char parsing errors. --- src/config.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/config.c b/src/config.c index 3acdbdd..daf6474 100644 --- a/src/config.c +++ b/src/config.c @@ -885,16 +885,23 @@ bool parse_bool(const char *filename, size_t lineno, const char *str, bool *err) uint32_t parse_char(const char *filename, size_t lineno, const char *str, bool *err) { uint32_t ch = U'\0'; + if (*str == '\0') { + return ch; + } + if (!utf8_validate(str)) { + PARSE_ERROR(filename, lineno, "Invalid UTF-8 string \"%s\".\n", str); + if (err) { + *err = true; + } + return ch; + } char *tmp = utf8_compose(str); - if (tmp == NULL) { + ch = utf8_to_utf32_validate(tmp); + if (ch == (uint32_t)-2 || ch == (uint32_t)-1 || *utf8_next_char(tmp) != '\0') { PARSE_ERROR(filename, lineno, "Failed to parse \"%s\" as a character.\n", str); - } else { - ch = utf8_to_utf32_validate(tmp); - if (ch == (uint32_t)-2 || ch == (uint32_t)-1 || *utf8_next_char(tmp) != '\0') { - PARSE_ERROR(filename, lineno, "Failed to parse \"%s\" as a character.\n", str); - } - free(tmp); } + free(tmp); + return ch; } -- cgit v1.2.3