From: Timo Sirainen Date: Wed, 6 May 2020 10:15:34 +0000 (+0300) Subject: lib: json-parser - Fix parsing \uXXXX in non-blocking input X-Git-Tag: 2.3.13~123 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1cf804030671c24fb323aa8e3ed2d26515dbea0f;p=thirdparty%2Fdovecot%2Fcore.git lib: json-parser - Fix parsing \uXXXX in non-blocking input If it was in the istream's read boundary it resulted as parsing error. --- diff --git a/src/lib/json-parser.c b/src/lib/json-parser.c index add5c42ec0..ba35ef495d 100644 --- a/src/lib/json-parser.c +++ b/src/lib/json-parser.c @@ -194,8 +194,10 @@ static int json_skip_string(struct json_parser *parser) case 't': break; case 'u': - if (parser->end - parser->data < 4) + if (parser->end - parser->data < 4) { + parser->data = parser->end; return -1; + } parser->data += 3; break; default: diff --git a/src/lib/test-json-parser.c b/src/lib/test-json-parser.c index 037802e832..30ac5da4bb 100644 --- a/src/lib/test-json-parser.c +++ b/src/lib/test-json-parser.c @@ -212,7 +212,7 @@ static void test_json_parser_skip_object_fields(void) "\"realm\":\"/employees\"," "\"token_type\":\"Bearer\"," "\"expires_in\":2377," - "\"client_id\":\"mosaic\"," + "\"client_i\\u0064\":\"mosaic\\u0064\"," "\"email\":\"\"," "\"extensions\":" "{\"algorithm\":\"cuttlefish\"," @@ -244,14 +244,15 @@ static void test_json_parser_skip_object_fields(void) test_assert(strcmp(value, keys[i]) == 0); json_parse_skip_next(parser); } + test_assert(i == keys_count); test_assert(json_parser_deinit(&parser, &error) == 0); i_stream_unref(&input); i = 0; input = test_istream_create_data(test_input, strlen(test_input)); parser = json_parser_init(input); - for (pos = 0; pos <= strlen(test_input); pos +=2) { - test_istream_set_size(input, pos); + for (pos = 0; pos <= strlen(test_input)*2; pos++) { + test_istream_set_size(input, pos/2); ret = json_parse_next(parser, &type, &value); if (ret == 0) continue; @@ -263,6 +264,7 @@ static void test_json_parser_skip_object_fields(void) json_parse_skip_next(parser); i++; } + test_assert(i == keys_count); test_assert(json_parser_deinit(&parser, &error) == 0); i_stream_unref(&input); test_end(); @@ -280,14 +282,15 @@ static void test_json_parser_skip_object_fields(void) test_assert(ret > 0 && type != JSON_TYPE_OBJECT_KEY); json_parse_skip(parser); } + test_assert(i == keys_count); test_assert(json_parser_deinit(&parser, &error) == 0); i_stream_unref(&input); i = 0; input = test_istream_create_data(test_input, strlen(test_input)); parser = json_parser_init(input); - for (pos = 0; pos <= strlen(test_input); pos +=2) { - test_istream_set_size(input, pos); + for (pos = 0; pos <= strlen(test_input)*2; pos++) { + test_istream_set_size(input, pos/2); ret = json_parse_next(parser, &type, &value); if (ret < 0) break; @@ -302,6 +305,7 @@ static void test_json_parser_skip_object_fields(void) json_parse_skip(parser); } } + test_assert(i == keys_count); test_assert(json_parser_deinit(&parser, &error) == 0); i_stream_unref(&input);