From: Sina Tavakoli Date: Wed, 13 Nov 2019 09:49:23 +0000 (+0200) Subject: lib: json-parser: Escape characters U+2028 and U+2029 to avoid CR-LF conflict with... X-Git-Tag: 2.3.9~39 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=60ba83f5fb6c10f3173c0541475a199d000585fe;p=thirdparty%2Fdovecot%2Fcore.git lib: json-parser: Escape characters U+2028 and U+2029 to avoid CR-LF conflict with some parsers. --- diff --git a/src/lib/json-parser.c b/src/lib/json-parser.c index 2caefc1064..adcd6fc181 100644 --- a/src/lib/json-parser.c +++ b/src/lib/json-parser.c @@ -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) diff --git a/src/lib/test-json-parser.c b/src/lib/test-json-parser.c index 87888d1c83..09e654d923 100644 --- a/src/lib/test-json-parser.c +++ b/src/lib/test-json-parser.c @@ -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(); }