]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: json-parser: Fix eager escaping UTF-8 characters
authorSina Tavakoli <sina.tavakoli@open-xchange.com>
Mon, 11 Nov 2019 13:24:07 +0000 (15:24 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 22 Nov 2019 10:37:42 +0000 (12:37 +0200)
src/lib/json-parser.c
src/lib/test-json-parser.c

index 7a14a0bc8789b8e29f2ab518e558b5159f441d12..2caefc10644489abf080a5695f417ef5a63fe7b2 100644 (file)
@@ -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);
        }
 }
 
index 199be39e773f0e4d0077a15cb313907b65febdbd..87888d1c83704231ce5ea59fb2a5b42248020013 100644 (file)
@@ -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();
 }