From: Sina Tavakoli Date: Mon, 11 Nov 2019 13:24:07 +0000 (+0200) Subject: lib: json-parser: Fix eager escaping UTF-8 characters X-Git-Tag: 2.3.10~301 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7e8f61f1498c09925da9db244de37c2fe3a5dc06;p=thirdparty%2Fdovecot%2Fcore.git lib: json-parser: Fix eager escaping UTF-8 characters --- diff --git a/src/lib/json-parser.c b/src/lib/json-parser.c index 7a14a0bc87..2caefc1064 100644 --- a/src/lib/json-parser.c +++ b/src/lib/json-parser.c @@ -792,14 +792,10 @@ static void json_append_escaped_char(string_t *dest, unsigned char src) void json_append_escaped_ucs4(string_t *dest, unichar_t chr) { - unichar_t high,low; if (chr < 0x80) json_append_escaped_char(dest, (unsigned char)chr); - else if (chr >= UTF16_SURROGATE_BASE) { - uni_split_surrogate(chr, &high, &low); - str_printfa(dest, "\\u%04x\\u%04x", high, low); - } else { - str_printfa(dest, "\\u%04x", chr); + else { + uni_ucs4_to_utf8_c(chr, dest); } } diff --git a/src/lib/test-json-parser.c b/src/lib/test-json-parser.c index 199be39e77..87888d1c83 100644 --- a/src/lib/test-json-parser.c +++ b/src/lib/test-json-parser.c @@ -30,7 +30,9 @@ static const char json_input[] = "\"key10\": \"foo\\\\\\\"\\b\\f\\n\\r\\t\\u0001\\u10ff\"," "\"key11\": []," "\"key12\": [ \"foo\" , 5.24,[true],{\"aobj\":[]}]," - "\"key13\": \"\\ud801\\udc37\"" + "\"key13\": \"\\ud801\\udc37\"," + "\"key14\": \"\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85\"," + "\"key15\": \"\\u10000\"" "}\n"; static const struct { @@ -89,7 +91,11 @@ static const struct { { JSON_TYPE_OBJECT_END, NULL }, { JSON_TYPE_ARRAY_END, NULL }, { JSON_TYPE_OBJECT_KEY, "key13" }, - { JSON_TYPE_STRING, "\xf0\x90\x90\xb7" } + { JSON_TYPE_STRING, "\xf0\x90\x90\xb7" }, + { JSON_TYPE_OBJECT_KEY, "key14" }, + { JSON_TYPE_STRING, "\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85" }, + { JSON_TYPE_OBJECT_KEY, "key15" }, + { JSON_TYPE_STRING, "\xe1\x80\x80""0" }, }; static int @@ -375,7 +381,7 @@ static void test_json_append_escaped(void) test_begin("json_append_escaped()"); json_append_escaped(str, "\b\f\r\n\t\"\\\001\002-\xC3\xA4\xf0\x90\x90\xb7\xff"); - test_assert(strcmp(str_c(str), "\\b\\f\\r\\n\\t\\\"\\\\\\u0001\\u0002-\\u00e4\\ud801\\udc37" UNICODE_REPLACEMENT_CHAR_UTF8) == 0); + test_assert(strcmp(str_c(str), "\\b\\f\\r\\n\\t\\\"\\\\\\u0001\\u0002-\xC3\xA4\xf0\x90\x90\xb7" UNICODE_REPLACEMENT_CHAR_UTF8) == 0); test_end(); } @@ -385,9 +391,9 @@ static void test_json_append_escaped_data(void) "\b\f\r\n\t\"\\\000\001\002-\xC3\xA4\xf0\x90\x90\xb7\xff"; string_t *str = t_str_new(32); - test_begin("json_append_escaped()"); + test_begin("json_append_escaped_data()"); json_append_escaped_data(str, test_input, sizeof(test_input)-1); - test_assert(strcmp(str_c(str), "\\b\\f\\r\\n\\t\\\"\\\\\\u0000\\u0001\\u0002-\\u00e4\\ud801\\udc37" UNICODE_REPLACEMENT_CHAR_UTF8) == 0); + test_assert(strcmp(str_c(str), "\\b\\f\\r\\n\\t\\\"\\\\\\u0000\\u0001\\u0002-\xC3\xA4\xf0\x90\x90\xb7" UNICODE_REPLACEMENT_CHAR_UTF8) == 0); test_end(); }