]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: json-parser - Fix parsing \uXXXX in non-blocking input
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 6 May 2020 10:15:34 +0000 (13:15 +0300)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Wed, 7 Oct 2020 13:57:27 +0000 (13:57 +0000)
If it was in the istream's read boundary it resulted as parsing error.

src/lib/json-parser.c
src/lib/test-json-parser.c

index add5c42ec0c47c261768ec20a7ea7e48064dbc7c..ba35ef495daab63b79ec348d12a7744457c8a62c 100644 (file)
@@ -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:
index 037802e8327abfab3589be10a8dd2c9bc74fb625..30ac5da4bb5ab868cd65116f482aec7654f7d88c 100644 (file)
@@ -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);