]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: json-parser: Escape characters U+2028 and U+2029 to avoid CR-LF conflict with...
authorSina Tavakoli <sina.tavakoli@open-xchange.com>
Wed, 13 Nov 2019 09:49:23 +0000 (11:49 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 22 Nov 2019 10:37:46 +0000 (12:37 +0200)
src/lib/json-parser.c
src/lib/test-json-parser.c

index 2caefc10644489abf080a5695f417ef5a63fe7b2..adcd6fc181a9f7ab857a7d2bafed062b961a9990 100644 (file)
@@ -794,9 +794,10 @@ void json_append_escaped_ucs4(string_t *dest, unichar_t chr)
 {
        if (chr < 0x80)
                json_append_escaped_char(dest, (unsigned char)chr);
-       else {
+       else if (chr == 0x2028 || chr == 0x2029)
+               str_printfa(dest, "\\u%04x", chr);
+       else
                uni_ucs4_to_utf8_c(chr, dest);
-       }
 }
 
 void ostream_escaped_json_format(string_t *dest, unsigned char src)
index 87888d1c83704231ce5ea59fb2a5b42248020013..09e654d92387e65404ce91f5fff48ef678c52b64 100644 (file)
@@ -380,20 +380,20 @@ static void test_json_append_escaped(void)
        string_t *str = t_str_new(32);
 
        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-\xC3\xA4\xf0\x90\x90\xb7" UNICODE_REPLACEMENT_CHAR_UTF8) == 0);
+       json_append_escaped(str, "\b\f\r\n\t\"\\\001\002-\xC3\xA4\xf0\x90\x90\xb7\xe2\x80\xa8\xe2\x80\xa9\xff");
+       test_assert(strcmp(str_c(str), "\\b\\f\\r\\n\\t\\\"\\\\\\u0001\\u0002-\xC3\xA4\xf0\x90\x90\xb7\\u2028\\u2029" UNICODE_REPLACEMENT_CHAR_UTF8) == 0);
        test_end();
 }
 
 static void test_json_append_escaped_data(void)
 {
        static const unsigned char test_input[] =
-               "\b\f\r\n\t\"\\\000\001\002-\xC3\xA4\xf0\x90\x90\xb7\xff";
+               "\b\f\r\n\t\"\\\000\001\002-\xC3\xA4\xf0\x90\x90\xb7\xe2\x80\xa8\xe2\x80\xa9\xff";
        string_t *str = t_str_new(32);
 
        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-\xC3\xA4\xf0\x90\x90\xb7" 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\\u2028\\u2029" UNICODE_REPLACEMENT_CHAR_UTF8) == 0);
        test_end();
 }