summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Jones <philj56@gmail.com>2022-11-24 14:55:47 +0000
committerPhil Jones <philj56@gmail.com>2022-11-24 14:55:47 +0000
commit1e863efba1c8d44b1f4faa8334a2c6ffb40e951c (patch)
tree60e4f241865b14374c022de70ecebfdd89f84c5a
parent03fc67cc74cc08fff5eb61e855b54174683614ff (diff)
Fix more potential char parsing errors.
-rw-r--r--src/config.c21
1 files changed, 14 insertions, 7 deletions
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;
}