Coverage Report

Created: 2026-04-12 06:26

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openvswitch/lib/json.c
Line
Count
Source
1
/*
2
 * Copyright (c) 2009-2012, 2014-2017 Nicira, Inc.
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at:
7
 *
8
 *     http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
17
#include <config.h>
18
19
#include "openvswitch/json.h"
20
21
#include <ctype.h>
22
#include <errno.h>
23
#include <float.h>
24
#include <limits.h>
25
#include <string.h>
26
27
#include "cooperative-multitasking.h"
28
#include "openvswitch/dynamic-string.h"
29
#include "hash.h"
30
#include "json.h"
31
#include "openvswitch/shash.h"
32
#include "unicode.h"
33
#include "util.h"
34
#include "uuid.h"
35
36
/* Non-public JSSF_* flags.  Must not overlap with public ones defined
37
 * in include/openvswitch/json.h. */
38
enum {
39
    JSSF_YIELD = 1 << 7,
40
};
41
42
/* The type of a JSON token. */
43
enum json_token_type {
44
    T_EOF = 0,
45
    T_BEGIN_ARRAY = '[',
46
    T_END_ARRAY = ']',
47
    T_BEGIN_OBJECT = '{',
48
    T_END_OBJECT = '}',
49
    T_NAME_SEPARATOR = ':',
50
    T_VALUE_SEPARATOR = ',',
51
    T_FALSE = UCHAR_MAX + 1,
52
    T_NULL,
53
    T_TRUE,
54
    T_INTEGER,
55
    T_REAL,
56
    T_STRING
57
};
58
59
/* A JSON token.
60
 *
61
 * RFC 4627 doesn't define a lexical structure for JSON but I believe this to
62
 * be compliant with the standard.
63
 */
64
struct json_token {
65
    enum json_token_type type;
66
    union {
67
        double real;
68
        long long int integer;
69
        const char *string;
70
    };
71
};
72
73
enum json_lex_state {
74
    JSON_LEX_START,             /* Not inside a token. */
75
    JSON_LEX_NUMBER,            /* Reading a number. */
76
    JSON_LEX_KEYWORD,           /* Reading a keyword. */
77
    JSON_LEX_STRING,            /* Reading a quoted string. */
78
    JSON_LEX_ESCAPE             /* In a quoted string just after a "\". */
79
};
80
81
enum json_parse_state {
82
    JSON_PARSE_START,           /* Beginning of input. */
83
    JSON_PARSE_END,             /* End of input. */
84
85
    /* Objects. */
86
    JSON_PARSE_OBJECT_INIT,     /* Expecting '}' or an object name. */
87
    JSON_PARSE_OBJECT_NAME,     /* Expecting an object name. */
88
    JSON_PARSE_OBJECT_COLON,    /* Expecting ':'. */
89
    JSON_PARSE_OBJECT_VALUE,    /* Expecting an object value. */
90
    JSON_PARSE_OBJECT_NEXT,     /* Expecting ',' or '}'. */
91
92
    /* Arrays. */
93
    JSON_PARSE_ARRAY_INIT,      /* Expecting ']' or a value. */
94
    JSON_PARSE_ARRAY_VALUE,     /* Expecting a value. */
95
    JSON_PARSE_ARRAY_NEXT       /* Expecting ',' or ']'. */
96
};
97
98
struct json_parser_node {
99
    struct json *json;
100
};
101
102
/* A JSON parser. */
103
struct json_parser {
104
    int flags;
105
106
    /* Lexical analysis. */
107
    enum json_lex_state lex_state;
108
    struct ds buffer;           /* Buffer for accumulating token text. */
109
    int line_number;
110
    int column_number;
111
    int byte_number;
112
113
    /* Parsing. */
114
    enum json_parse_state parse_state;
115
1.69M
#define JSON_MAX_HEIGHT 1000
116
    struct json_parser_node *stack;
117
    size_t height, allocated_height;
118
    char *member_name;
119
120
    /* Parse status. */
121
    bool done;
122
    char *error;                /* Error message, if any, null if none yet. */
123
};
124
125
static struct json *json_create(enum json_type type);
126
static void json_parser_input(struct json_parser *, struct json_token *);
127
128
static void json_error(struct json_parser *p, const char *format, ...)
129
    OVS_PRINTF_FORMAT(2, 3);
130

131
const char *
132
json_type_to_string(enum json_type type)
133
0
{
134
0
    switch (type) {
135
0
    case JSON_NULL:
136
0
        return "null";
137
138
0
    case JSON_FALSE:
139
0
        return "false";
140
141
0
    case JSON_TRUE:
142
0
        return "true";
143
144
0
    case JSON_OBJECT:
145
0
        return "object";
146
147
0
    case JSON_ARRAY:
148
0
        return "array";
149
150
0
    case JSON_INTEGER:
151
0
    case JSON_REAL:
152
0
        return "number";
153
154
0
    case JSON_STRING:
155
0
        return "string";
156
157
0
    case JSON_SERIALIZED_OBJECT:
158
0
    case JSON_N_TYPES:
159
0
    default:
160
0
        return "<invalid>";
161
0
    }
162
0
}
163

164
/* Functions for manipulating struct json. */
165
166
struct json *
167
json_null_create(void)
168
42.8k
{
169
42.8k
    return json_create(JSON_NULL);
170
42.8k
}
171
172
struct json *
173
json_boolean_create(bool b)
174
3.41k
{
175
3.41k
    return json_create(b ? JSON_TRUE : JSON_FALSE);
176
3.41k
}
177
178
struct json *
179
json_string_create_nocopy(char *s)
180
2.54k
{
181
2.54k
    struct json *json = json_create(JSON_STRING);
182
2.54k
    json->storage_type = JSON_STRING_DYNAMIC;
183
2.54k
    json->str_ptr = s;
184
2.54k
    return json;
185
2.54k
}
186
187
struct json *
188
json_string_create(const char *s)
189
19.3k
{
190
19.3k
    struct json *json = json_create(JSON_STRING);
191
19.3k
    size_t length = strlen(s);
192
193
19.3k
    if (length <= JSON_STRING_INLINE_LEN) {
194
18.6k
        json->storage_type = JSON_STRING_INLINE;
195
18.6k
        memcpy(json->str, s, length);
196
18.6k
        json->str[length] = '\0';
197
18.6k
    } else {
198
724
        json->storage_type = JSON_STRING_DYNAMIC;
199
724
        json->str_ptr = xmemdup0(s, length);
200
724
    }
201
19.3k
    return json;
202
19.3k
}
203
204
struct json *json_string_create_uuid(const struct uuid *uuid)
205
0
{
206
0
    return json_string_create_nocopy(uuid_to_string(uuid));
207
0
}
208
209
struct json *
210
json_serialized_object_create(const struct json *src)
211
0
{
212
0
    struct json *json = json_create(JSON_SERIALIZED_OBJECT);
213
0
    json->str_ptr = json_to_string(src, JSSF_SORT);
214
0
    return json;
215
0
}
216
217
struct json *
218
json_serialized_object_create_with_yield(const struct json *src)
219
0
{
220
0
    struct json *json = json_create(JSON_SERIALIZED_OBJECT);
221
0
    json->str_ptr = json_to_string(src, JSSF_SORT | JSSF_YIELD);
222
0
    return json;
223
0
}
224
225
struct json *
226
json_array_create_empty(void)
227
385k
{
228
385k
    struct json *json = json_create(JSON_ARRAY);
229
385k
    json->storage_type = JSON_ARRAY_DYNAMIC;
230
385k
    json->array.elements = NULL;
231
385k
    json->array.size = 0;
232
385k
    json->array.allocated = 0;
233
385k
    return json;
234
385k
}
235
236
void
237
json_array_add(struct json *array_, struct json *element)
238
17.7M
{
239
17.7M
    switch (array_->storage_type) {
240
17.7M
    case JSON_ARRAY_DYNAMIC:
241
17.7M
        if (!array_->array.size) {
242
276k
            array_->storage_type = JSON_ARRAY_INLINE_1;
243
276k
            array_->elements[0] = element;
244
276k
            return;
245
276k
        }
246
17.4M
        break;
247
248
17.4M
    case JSON_ARRAY_INLINE_1:
249
33.0k
    case JSON_ARRAY_INLINE_2:
250
33.0k
        array_->elements[array_->storage_type - JSON_ARRAY_DYNAMIC] = element;
251
33.0k
        array_->storage_type++;
252
33.0k
        return;
253
254
6.93k
    case JSON_ARRAY_INLINE_3: {
255
6.93k
        struct json **elements = xmalloc(4 * sizeof *elements);
256
257
6.93k
        memcpy(elements, array_->elements, 3 * sizeof array_->elements[0]);
258
6.93k
        array_->array.elements = elements;
259
6.93k
        array_->array.elements[3] = element;
260
6.93k
        array_->array.size = 4;
261
6.93k
        array_->array.allocated = 4;
262
6.93k
        array_->storage_type = JSON_ARRAY_DYNAMIC;
263
6.93k
        return;
264
23.6k
    }
265
266
0
    case JSON_STRING_DYNAMIC:
267
0
    case JSON_STRING_INLINE:
268
0
    default:
269
0
        OVS_NOT_REACHED();
270
17.7M
    }
271
272
17.4M
    struct json_array *array = &array_->array;
273
17.4M
    if (array->size >= array->allocated) {
274
18.3k
        array->elements = x2nrealloc(array->elements, &array->allocated,
275
18.3k
                                     sizeof *array->elements);
276
18.3k
    }
277
17.4M
    array->elements[array->size++] = element;
278
17.4M
}
279
280
void
281
json_array_set(struct json *json, size_t index, struct json *element)
282
0
{
283
0
    ovs_assert(json_array_size(json) > index);
284
0
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
285
0
        json->array.elements[index] = element;
286
0
    } else {
287
0
        json->elements[index] = element;
288
0
    }
289
0
}
290
291
struct json *
292
json_array_pop(struct json *json)
293
0
{
294
0
    if (!json_array_size(json)) {
295
0
        return NULL;
296
0
    }
297
0
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
298
0
        return json->array.elements[--json->array.size];
299
0
    }
300
0
    if (json->storage_type > JSON_ARRAY_INLINE_1) {
301
0
        return json->elements[--json->storage_type - JSON_ARRAY_DYNAMIC];
302
0
    }
303
304
    /* Need to fall back to an empty array in case it's the last
305
     * inline element. */
306
0
    struct json *element = json->elements[0];
307
0
    json->storage_type = JSON_ARRAY_DYNAMIC;
308
0
    json->array.elements = NULL;
309
0
    json->array.size = 0;
310
0
    json->array.allocated = 0;
311
0
    return element;
312
0
}
313
314
void
315
json_array_trim(struct json *array_)
316
358k
{
317
358k
    if (array_->storage_type != JSON_ARRAY_DYNAMIC) {
318
243k
        return;
319
243k
    }
320
321
115k
    struct json_array *array = &array_->array;
322
115k
    if (array->size < array->allocated) {
323
5.16k
        array->allocated = array->size;
324
5.16k
        array->elements = xrealloc(array->elements,
325
5.16k
                                   array->size * sizeof *array->elements);
326
5.16k
    }
327
115k
}
328
329
struct json *
330
json_array_create(struct json **elements, size_t n)
331
0
{
332
0
    struct json *json = json_create(JSON_ARRAY);
333
0
    json->storage_type = JSON_ARRAY_DYNAMIC;
334
0
    json->array.elements = elements;
335
0
    json->array.size = n;
336
0
    json->array.allocated = n;
337
0
    return json;
338
0
}
339
340
struct json *
341
json_array_create_1(struct json *elem0)
342
0
{
343
0
    struct json *json = json_create(JSON_ARRAY);
344
345
0
    json->storage_type = JSON_ARRAY_INLINE_1;
346
0
    json->elements[0] = elem0;
347
348
0
    return json;
349
0
}
350
351
struct json *
352
json_array_create_2(struct json *elem0, struct json *elem1)
353
0
{
354
0
    struct json *json = json_create(JSON_ARRAY);
355
356
0
    json->storage_type = JSON_ARRAY_INLINE_2;
357
0
    json->elements[0] = elem0;
358
0
    json->elements[1] = elem1;
359
360
0
    return json;
361
0
}
362
363
struct json *
364
json_array_create_3(struct json *elem0, struct json *elem1, struct json *elem2)
365
0
{
366
0
    struct json *json = json_create(JSON_ARRAY);
367
368
0
    json->storage_type = JSON_ARRAY_INLINE_3;
369
0
    json->elements[0] = elem0;
370
0
    json->elements[1] = elem1;
371
0
    json->elements[2] = elem2;
372
373
0
    return json;
374
0
}
375
376
bool
377
json_array_contains_string(const struct json *json, const char *str)
378
0
{
379
0
    size_t n = json_array_size(json);
380
381
0
    for (size_t i = 0; i < n; i++) {
382
0
        const struct json *elem = json_array_at(json, i);
383
384
0
        if (elem->type == JSON_STRING && !strcmp(json_string(elem), str)) {
385
0
            return true;
386
0
        }
387
0
    }
388
0
    return false;
389
0
}
390
391
struct json *
392
json_object_create(void)
393
1.30M
{
394
1.30M
    struct json *json = json_create(JSON_OBJECT);
395
1.30M
    json->object = xmalloc(sizeof *json->object);
396
1.30M
    shash_init(json->object);
397
1.30M
    return json;
398
1.30M
}
399
400
bool
401
json_object_is_empty(struct json *json)
402
0
{
403
0
    return json && json->type == JSON_OBJECT
404
0
           && shash_is_empty(json->object);
405
0
}
406
407
struct json *
408
json_integer_create(long long int integer)
409
16.0M
{
410
16.0M
    struct json *json = json_create(JSON_INTEGER);
411
16.0M
    json->integer = integer;
412
16.0M
    return json;
413
16.0M
}
414
415
struct json *
416
json_real_create(double real)
417
62.4k
{
418
62.4k
    struct json *json = json_create(JSON_REAL);
419
62.4k
    json->real = real;
420
62.4k
    return json;
421
62.4k
}
422
423
void
424
json_object_put(struct json *json, const char *name, struct json *value)
425
717
{
426
717
    json_destroy(shash_replace(json->object, name, value));
427
717
}
428
429
void
430
json_object_put_nocopy(struct json *json, char *name, struct json *value)
431
48.0k
{
432
48.0k
    json_destroy(shash_replace_nocopy(json->object, name, value));
433
48.0k
}
434
435
void
436
json_object_put_string(struct json *json, const char *name, const char *value)
437
0
{
438
0
    json_object_put(json, name, json_string_create(value));
439
0
}
440
441
void OVS_PRINTF_FORMAT(3, 4)
442
json_object_put_format(struct json *json,
443
                       const char *name, const char *format, ...)
444
0
{
445
0
    va_list args;
446
0
    va_start(args, format);
447
0
    json_object_put(json, name,
448
0
                    json_string_create_nocopy(xvasprintf(format, args)));
449
0
    va_end(args);
450
0
}
451
452
void json_object_put_uuid(struct json *json,
453
                          const char *name, const struct uuid *uuid)
454
0
{
455
0
    json_object_put(json, name, json_string_create_uuid(uuid));
456
0
}
457
458
const char *
459
json_string(const struct json *json)
460
17.8k
{
461
17.8k
    ovs_assert(json->type == JSON_STRING);
462
17.8k
    return json->storage_type == JSON_STRING_DYNAMIC
463
17.8k
           ? json->str_ptr : json->str;
464
17.8k
}
465
466
const char *
467
json_serialized_object(const struct json *json)
468
0
{
469
0
    ovs_assert(json->type == JSON_SERIALIZED_OBJECT);
470
0
    return json->str_ptr;
471
0
}
472
473
size_t
474
json_array_size(const struct json *json)
475
849k
{
476
849k
    ovs_assert(json->type == JSON_ARRAY);
477
849k
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
478
332k
        return json->array.size;
479
332k
    }
480
517k
    return json->storage_type - JSON_ARRAY_DYNAMIC;
481
849k
}
482
483
const struct json *
484
json_array_at(const struct json *json, size_t index)
485
36.0M
{
486
36.0M
    ovs_assert(json->type == JSON_ARRAY);
487
488
36.0M
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
489
35.5M
        if (json->array.size <= index) {
490
0
            return NULL;
491
0
        }
492
35.5M
        return json->array.elements[index];
493
35.5M
    }
494
495
554k
    if (json->storage_type - JSON_ARRAY_DYNAMIC <= index) {
496
0
        return NULL;
497
0
    }
498
554k
    return json->elements[index];
499
554k
}
500
501
struct shash *
502
json_object(const struct json *json)
503
725
{
504
725
    ovs_assert(json->type == JSON_OBJECT);
505
725
    return CONST_CAST(struct shash *, json->object);
506
725
}
507
508
bool
509
json_boolean(const struct json *json)
510
0
{
511
0
    ovs_assert(json->type == JSON_TRUE || json->type == JSON_FALSE);
512
0
    return json->type == JSON_TRUE;
513
0
}
514
515
double
516
json_real(const struct json *json)
517
0
{
518
0
    ovs_assert(json->type == JSON_REAL || json->type == JSON_INTEGER);
519
0
    return json->type == JSON_REAL ? json->real : json->integer;
520
0
}
521
522
int64_t
523
json_integer(const struct json *json)
524
0
{
525
0
    ovs_assert(json->type == JSON_INTEGER);
526
0
    return json->integer;
527
0
}
528

529
static void json_destroy_object(struct shash *object, bool yield);
530
static void json_destroy_array(struct json *json, bool yield);
531
532
/* Frees 'json' and everything it points to, recursively. */
533
void
534
json_destroy__(struct json *json, bool yield)
535
17.8M
{
536
17.8M
    switch (json->type) {
537
1.30M
    case JSON_OBJECT:
538
1.30M
        json_destroy_object(json->object, yield);
539
1.30M
        break;
540
541
385k
    case JSON_ARRAY:
542
385k
        json_destroy_array(json, yield);
543
385k
        break;
544
545
21.8k
    case JSON_STRING:
546
21.8k
        if (json->storage_type == JSON_STRING_DYNAMIC) {
547
3.26k
            free(json->str_ptr);
548
3.26k
        }
549
21.8k
        break;
550
551
0
    case JSON_SERIALIZED_OBJECT:
552
0
        free(json->str_ptr);
553
0
        break;
554
555
42.8k
    case JSON_NULL:
556
44.3k
    case JSON_FALSE:
557
46.2k
    case JSON_TRUE:
558
16.0M
    case JSON_INTEGER:
559
16.1M
    case JSON_REAL:
560
16.1M
        break;
561
562
0
    case JSON_N_TYPES:
563
0
        OVS_NOT_REACHED();
564
17.8M
    }
565
17.8M
    free(json);
566
17.8M
}
567
568
static void
569
json_destroy_object(struct shash *object, bool yield)
570
1.30M
{
571
1.30M
    struct shash_node *node;
572
573
1.30M
    if (yield) {
574
0
        cooperative_multitasking_yield();
575
0
    }
576
577
1.30M
    SHASH_FOR_EACH_SAFE (node, object) {
578
45.5k
        struct json *value = node->data;
579
580
45.5k
        if (yield) {
581
0
            json_destroy_with_yield(value);
582
45.5k
        } else {
583
45.5k
            json_destroy(value);
584
45.5k
        }
585
45.5k
        shash_delete(object, node);
586
45.5k
    }
587
1.30M
    shash_destroy(object);
588
1.30M
    free(object);
589
1.30M
}
590
591
static void
592
json_destroy_array(struct json *json, bool yield)
593
385k
{
594
385k
    size_t i, n = json_array_size(json);
595
596
385k
    if (yield) {
597
0
        cooperative_multitasking_yield();
598
0
    }
599
600
18.1M
    for (i = 0; i < n; i++) {
601
17.7M
        if (yield) {
602
0
            json_destroy_with_yield(
603
0
                CONST_CAST(struct json *, json_array_at(json, i)));
604
17.7M
        } else {
605
17.7M
            json_destroy(CONST_CAST(struct json *, json_array_at(json, i)));
606
17.7M
        }
607
17.7M
    }
608
385k
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
609
116k
        free(json->array.elements);
610
116k
    }
611
385k
}
612

613
static struct json *json_deep_clone_object(const struct shash *object);
614
static struct json *json_deep_clone_array(const struct json *);
615
616
/* Returns a deep copy of 'json'. */
617
struct json *
618
json_deep_clone(const struct json *json)
619
0
{
620
0
    switch (json->type) {
621
0
    case JSON_OBJECT:
622
0
        return json_deep_clone_object(json->object);
623
624
0
    case JSON_ARRAY:
625
0
        return json_deep_clone_array(json);
626
627
0
    case JSON_STRING:
628
0
        return json_string_create(json_string(json));
629
630
0
    case JSON_SERIALIZED_OBJECT:
631
0
        return json_serialized_object_create(json);
632
633
0
    case JSON_NULL:
634
0
    case JSON_FALSE:
635
0
    case JSON_TRUE:
636
0
        return json_create(json->type);
637
638
0
    case JSON_INTEGER:
639
0
        return json_integer_create(json->integer);
640
641
0
    case JSON_REAL:
642
0
        return json_real_create(json->real);
643
644
0
    case JSON_N_TYPES:
645
0
    default:
646
0
        OVS_NOT_REACHED();
647
0
    }
648
0
}
649
650
struct json *
651
json_nullable_clone(const struct json *json)
652
0
{
653
0
    return json ? json_clone(json) : NULL;
654
0
}
655
656
static struct json *
657
json_deep_clone_object(const struct shash *object)
658
0
{
659
0
    struct shash_node *node;
660
0
    struct json *json;
661
662
0
    json = json_object_create();
663
0
    SHASH_FOR_EACH (node, object) {
664
0
        struct json *value = node->data;
665
0
        json_object_put(json, node->name, json_deep_clone(value));
666
0
    }
667
0
    return json;
668
0
}
669
670
static struct json *
671
json_deep_clone_array(const struct json *json)
672
0
{
673
0
    struct json **elements;
674
0
    size_t i, n;
675
676
0
    n = json_array_size(json);
677
0
    switch (n) {
678
0
    case 0:
679
0
        return json_array_create_empty();
680
0
    case 1:
681
0
        return json_array_create_1(json_deep_clone(json_array_at(json, 0)));
682
0
    case 2:
683
0
        return json_array_create_2(json_deep_clone(json_array_at(json, 0)),
684
0
                                   json_deep_clone(json_array_at(json, 1)));
685
0
    case 3:
686
0
        return json_array_create_3(json_deep_clone(json_array_at(json, 0)),
687
0
                                   json_deep_clone(json_array_at(json, 1)),
688
0
                                   json_deep_clone(json_array_at(json, 2)));
689
0
    default:
690
0
        break;
691
0
    }
692
693
0
    elements = xmalloc(n * sizeof *elements);
694
0
    for (i = 0; i < n; i++) {
695
0
        elements[i] = json_deep_clone(json_array_at(json, i));
696
0
    }
697
0
    return json_array_create(elements, n);
698
0
}
699

700
static size_t
701
json_hash_object(const struct shash *object, size_t basis)
702
0
{
703
0
    const struct shash_node **nodes;
704
0
    size_t n, i;
705
706
0
    nodes = shash_sort(object);
707
0
    n = shash_count(object);
708
0
    for (i = 0; i < n; i++) {
709
0
        const struct shash_node *node = nodes[i];
710
0
        basis = hash_string(node->name, basis);
711
0
        basis = json_hash(node->data, basis);
712
0
    }
713
0
    free(nodes);
714
0
    return basis;
715
0
}
716
717
static size_t
718
json_hash_array(const struct json *json, size_t basis)
719
0
{
720
0
    size_t i, n = json_array_size(json);
721
722
0
    basis = hash_int(n, basis);
723
0
    for (i = 0; i < n; i++) {
724
0
        basis = json_hash(json_array_at(json, i), basis);
725
0
    }
726
0
    return basis;
727
0
}
728
729
size_t
730
json_hash(const struct json *json, size_t basis)
731
0
{
732
0
    switch (json->type) {
733
0
    case JSON_OBJECT:
734
0
        return json_hash_object(json->object, basis);
735
736
0
    case JSON_ARRAY:
737
0
        return json_hash_array(json, basis);
738
739
0
    case JSON_STRING:
740
0
        return hash_string(json_string(json), basis);
741
742
0
    case JSON_SERIALIZED_OBJECT:
743
0
        return hash_string(json_serialized_object(json), basis);
744
745
0
    case JSON_NULL:
746
0
    case JSON_FALSE:
747
0
    case JSON_TRUE:
748
0
        return hash_int(json->type << 8, basis);
749
750
0
    case JSON_INTEGER:
751
0
        return hash_int(json->integer, basis);
752
753
0
    case JSON_REAL:
754
0
        return hash_double(json->real, basis);
755
756
0
    case JSON_N_TYPES:
757
0
    default:
758
0
        OVS_NOT_REACHED();
759
0
    }
760
0
}
761
762
static bool
763
json_equal_object(const struct shash *a, const struct shash *b)
764
0
{
765
0
    struct shash_node *a_node;
766
767
0
    if (shash_count(a) != shash_count(b)) {
768
0
        return false;
769
0
    }
770
771
0
    SHASH_FOR_EACH (a_node, a) {
772
0
        struct shash_node *b_node = shash_find(b, a_node->name);
773
0
        if (!b_node || !json_equal(a_node->data, b_node->data)) {
774
0
            return false;
775
0
        }
776
0
    }
777
778
0
    return true;
779
0
}
780
781
static bool
782
json_equal_array(const struct json *a, const struct json *b)
783
0
{
784
0
    size_t i, n = json_array_size(a);
785
786
0
    if (n != json_array_size(b)) {
787
0
        return false;
788
0
    }
789
790
0
    for (i = 0; i < n; i++) {
791
0
        if (!json_equal(json_array_at(a, i), json_array_at(b, i))) {
792
0
            return false;
793
0
        }
794
0
    }
795
796
0
    return true;
797
0
}
798
799
bool
800
json_equal(const struct json *a, const struct json *b)
801
0
{
802
0
    if (a == b) {
803
0
        return true;
804
0
    } else if (!a || !b) {
805
0
        return false;
806
0
    } else if (a->type != b->type) {
807
0
        return false;
808
0
    }
809
810
0
    switch (a->type) {
811
0
    case JSON_OBJECT:
812
0
        return json_equal_object(a->object, b->object);
813
814
0
    case JSON_ARRAY:
815
0
        return json_equal_array(a, b);
816
817
0
    case JSON_STRING:
818
0
        return !strcmp(json_string(a), json_string(b));
819
820
0
    case JSON_SERIALIZED_OBJECT:
821
0
        return !strcmp(json_serialized_object(a), json_serialized_object(b));
822
823
0
    case JSON_NULL:
824
0
    case JSON_FALSE:
825
0
    case JSON_TRUE:
826
0
        return true;
827
828
0
    case JSON_INTEGER:
829
0
        return a->integer == b->integer;
830
831
0
    case JSON_REAL:
832
0
        return a->real == b->real;
833
834
0
    case JSON_N_TYPES:
835
0
    default:
836
0
        OVS_NOT_REACHED();
837
0
    }
838
0
}
839

840
/* Lexical analysis. */
841
842
static void
843
json_lex_keyword(struct json_parser *p)
844
46.2k
{
845
46.2k
    struct json_token token;
846
46.2k
    const char *s;
847
848
46.2k
    s = ds_cstr(&p->buffer);
849
46.2k
    if (!strcmp(s, "false")) {
850
1.46k
        token.type = T_FALSE;
851
44.7k
    } else if (!strcmp(s, "true")) {
852
1.96k
        token.type = T_TRUE;
853
42.7k
    } else if (!strcmp(s, "null")) {
854
42.6k
        token.type = T_NULL;
855
42.6k
    } else {
856
158
        json_error(p, "invalid keyword '%s'", s);
857
158
        return;
858
158
    }
859
46.0k
    json_parser_input(p, &token);
860
46.0k
}
861
862
static void
863
json_lex_number(struct json_parser *p)
864
16.0M
{
865
16.0M
    const char *cp = ds_cstr(&p->buffer);
866
16.0M
    unsigned long long int significand = 0;
867
16.0M
    struct json_token token;
868
16.0M
    bool imprecise = false;
869
16.0M
    bool negative = false;
870
16.0M
    int pow10 = 0;
871
872
    /* Leading minus sign. */
873
16.0M
    if (*cp == '-') {
874
25.9k
        negative = true;
875
25.9k
        cp++;
876
25.9k
    }
877
878
    /* At least one integer digit, but 0 may not be used as a leading digit for
879
     * a longer number. */
880
16.0M
    significand = 0;
881
16.0M
    if (*cp == '0') {
882
9.85M
        cp++;
883
9.85M
        if (isdigit((unsigned char) *cp)) {
884
2
            json_error(p, "leading zeros not allowed");
885
2
            return;
886
2
        }
887
9.85M
    } else if (isdigit((unsigned char) *cp)) {
888
9.51M
        do {
889
9.51M
            if (significand <= ULLONG_MAX / 10) {
890
8.39M
                significand = significand * 10 + (*cp - '0');
891
8.39M
            } else {
892
1.11M
                pow10++;
893
1.11M
                if (*cp != '0') {
894
84.4k
                    imprecise = true;
895
84.4k
                }
896
1.11M
            }
897
9.51M
            cp++;
898
9.51M
        } while (isdigit((unsigned char) *cp));
899
6.21M
    } else {
900
11
        json_error(p, "'-' must be followed by digit");
901
11
        return;
902
11
    }
903
904
    /* Optional fraction. */
905
16.0M
    if (*cp == '.') {
906
39.0k
        cp++;
907
39.0k
        if (!isdigit((unsigned char) *cp)) {
908
2
            json_error(p, "decimal point must be followed by digit");
909
2
            return;
910
2
        }
911
51.6k
        do {
912
51.6k
            if (significand <= ULLONG_MAX / 10) {
913
50.3k
                significand = significand * 10 + (*cp - '0');
914
50.3k
                pow10--;
915
50.3k
            } else if (*cp != '0') {
916
827
                imprecise = true;
917
827
            }
918
51.6k
            cp++;
919
51.6k
        } while (isdigit((unsigned char) *cp));
920
39.0k
    }
921
922
    /* Optional exponent. */
923
16.0M
    if (*cp == 'e' || *cp == 'E') {
924
5.16k
        bool negative_exponent = false;
925
5.16k
        int exponent;
926
927
5.16k
        cp++;
928
5.16k
        if (*cp == '+') {
929
2.18k
            cp++;
930
2.98k
        } else if (*cp == '-') {
931
634
            negative_exponent = true;
932
634
            cp++;
933
634
        }
934
935
5.16k
        if (!isdigit((unsigned char) *cp)) {
936
28
            json_error(p, "exponent must contain at least one digit");
937
28
            return;
938
28
        }
939
940
5.13k
        exponent = 0;
941
10.2k
        do {
942
10.2k
            if (exponent >= INT_MAX / 10) {
943
3
                goto bad_exponent;
944
3
            }
945
10.2k
            exponent = exponent * 10 + (*cp - '0');
946
10.2k
            cp++;
947
10.2k
        } while (isdigit((unsigned char) *cp));
948
949
5.13k
        if (negative_exponent) {
950
628
            if (pow10 < INT_MIN + exponent) {
951
1
                goto bad_exponent;
952
1
            }
953
627
            pow10 -= exponent;
954
4.50k
        } else {
955
4.50k
            if (pow10 > INT_MAX - exponent) {
956
21
                goto bad_exponent;
957
21
            }
958
4.48k
            pow10 += exponent;
959
4.48k
        }
960
5.13k
    }
961
962
16.0M
    if (*cp != '\0') {
963
4
        json_error(p, "syntax error in number");
964
4
        return;
965
4
    }
966
967
    /* Figure out number.
968
     *
969
     * We suppress negative zeros as a matter of policy. */
970
16.0M
    if (!significand) {
971
9.85M
        token.type = T_INTEGER;
972
9.85M
        token.integer = 0;
973
9.85M
        json_parser_input(p, &token);
974
9.85M
        return;
975
9.85M
    }
976
977
6.21M
    if (!imprecise) {
978
6.23M
        while (pow10 > 0 && significand < ULLONG_MAX / 10) {
979
52.3k
            significand *= 10;
980
52.3k
            pow10--;
981
52.3k
        }
982
6.19M
        while (pow10 < 0 && significand % 10 == 0) {
983
6.76k
            significand /= 10;
984
6.76k
            pow10++;
985
6.76k
        }
986
6.18M
        if (pow10 == 0
987
6.15M
            && significand <= (negative
988
6.15M
                               ? (unsigned long long int) LLONG_MAX + 1
989
6.15M
                               : LLONG_MAX)) {
990
6.15M
            token.type = T_INTEGER;
991
6.15M
            token.integer = negative ? -significand : significand;
992
6.15M
            json_parser_input(p, &token);
993
6.15M
            return;
994
6.15M
        }
995
6.18M
    }
996
997
63.0k
    token.type = T_REAL;
998
63.0k
    if (!str_to_double(ds_cstr(&p->buffer), &token.real)) {
999
68
        json_error(p, "number outside valid range");
1000
68
        return;
1001
68
    }
1002
    /* Suppress negative zero. */
1003
62.9k
    if (token.real == 0) {
1004
265
        token.real = 0;
1005
265
    }
1006
62.9k
    json_parser_input(p, &token);
1007
62.9k
    return;
1008
1009
25
bad_exponent:
1010
25
    json_error(p, "exponent outside valid range");
1011
25
}
1012
1013
static const char *
1014
json_lex_4hex(const char *cp, const char *end, int *valuep)
1015
38.6k
{
1016
38.6k
    unsigned int value;
1017
38.6k
    bool ok;
1018
1019
38.6k
    if (cp + 4 > end) {
1020
446
        return "quoted string ends within \\u escape";
1021
446
    }
1022
1023
38.1k
    value = hexits_value(cp, 4, &ok);
1024
38.1k
    if (!ok) {
1025
1.57k
        return "malformed \\u escape";
1026
1.57k
    }
1027
36.6k
    if (!value) {
1028
465
        return "null bytes not supported in quoted strings";
1029
465
    }
1030
36.1k
    *valuep = value;
1031
36.1k
    return NULL;
1032
36.6k
}
1033
1034
static const char *
1035
json_lex_unicode(const char *cp, const char *end, struct ds *out)
1036
32.6k
{
1037
32.6k
    const char *error;
1038
32.6k
    int c0, c1;
1039
1040
32.6k
    error = json_lex_4hex(cp, end, &c0);
1041
32.6k
    if (error) {
1042
1.94k
        ds_clear(out);
1043
1.94k
        ds_put_cstr(out, error);
1044
1.94k
        return NULL;
1045
1.94k
    }
1046
30.7k
    cp += 4;
1047
30.7k
    if (!uc_is_leading_surrogate(c0)) {
1048
23.7k
        ds_put_utf8(out, c0);
1049
23.7k
        return cp;
1050
23.7k
    }
1051
1052
6.94k
    if (cp + 2 > end || *cp++ != '\\' || *cp++ != 'u') {
1053
981
        ds_clear(out);
1054
981
        ds_put_cstr(out, "malformed escaped surrogate pair");
1055
981
        return NULL;
1056
981
    }
1057
1058
5.96k
    error = json_lex_4hex(cp, end, &c1);
1059
5.96k
    if (error) {
1060
544
        ds_clear(out);
1061
544
        ds_put_cstr(out, error);
1062
544
        return NULL;
1063
544
    }
1064
5.42k
    cp += 4;
1065
5.42k
    if (!uc_is_trailing_surrogate(c1)) {
1066
242
        ds_clear(out);
1067
242
        ds_put_cstr(out, "second half of escaped surrogate pair is not "
1068
242
                    "trailing surrogate");
1069
242
        return NULL;
1070
242
    }
1071
1072
5.17k
    ds_put_utf8(out, utf16_decode_surrogate_pair(c0, c1));
1073
5.17k
    return cp;
1074
5.42k
}
1075
1076
bool
1077
json_string_unescape(const char *in, size_t in_len, char **outp)
1078
20.9k
{
1079
20.9k
    const char *end = in + in_len;
1080
20.9k
    bool ok = false;
1081
20.9k
    struct ds out;
1082
1083
20.9k
    ds_init(&out);
1084
20.9k
    ds_reserve(&out, in_len);
1085
37.5M
    while (in < end) {
1086
37.5M
        if (*in == '"') {
1087
453
            ds_clear(&out);
1088
453
            ds_put_cstr(&out, "quoted string may not include unescaped \"");
1089
453
            goto exit;
1090
453
        }
1091
37.5M
        if (*in != '\\') {
1092
37.0M
            ds_put_char(&out, *in++);
1093
37.0M
            continue;
1094
37.0M
        }
1095
1096
518k
        in++;
1097
518k
        if (in >= end) {
1098
            /* The JSON parser will never trigger this message, because its
1099
             * lexer will never pass in a string that ends in a single
1100
             * backslash, but json_string_unescape() has other callers that
1101
             * are not as careful.*/
1102
356
            ds_clear(&out);
1103
356
            ds_put_cstr(&out, "quoted string may not end with backslash");
1104
356
            goto exit;
1105
356
        }
1106
517k
        switch (*in++) {
1107
357k
        case '"': case '\\': case '/':
1108
357k
            ds_put_char(&out, in[-1]);
1109
357k
            break;
1110
1111
60.8k
        case 'b':
1112
60.8k
            ds_put_char(&out, '\b');
1113
60.8k
            break;
1114
1115
35.6k
        case 'f':
1116
35.6k
            ds_put_char(&out, '\f');
1117
35.6k
            break;
1118
1119
4.93k
        case 'n':
1120
4.93k
            ds_put_char(&out, '\n');
1121
4.93k
            break;
1122
1123
18.5k
        case 'r':
1124
18.5k
            ds_put_char(&out, '\r');
1125
18.5k
            break;
1126
1127
6.68k
        case 't':
1128
6.68k
            ds_put_char(&out, '\t');
1129
6.68k
            break;
1130
1131
32.6k
        case 'u':
1132
32.6k
            in = json_lex_unicode(in, end, &out);
1133
32.6k
            if (!in) {
1134
3.71k
                goto exit;
1135
3.71k
            }
1136
28.9k
            break;
1137
1138
28.9k
        default:
1139
894
            ds_clear(&out);
1140
894
            ds_put_format(&out, "bad escape \\%c", in[-1]);
1141
894
            goto exit;
1142
517k
        }
1143
517k
    }
1144
15.5k
    ok = true;
1145
1146
20.9k
exit:
1147
20.9k
    *outp = ds_cstr(&out);
1148
20.9k
    return ok;
1149
15.5k
}
1150
1151
void
1152
json_string_escape(const char *in, struct ds *out)
1153
0
{
1154
0
    struct json json = {
1155
0
        .type = JSON_STRING,
1156
0
        .storage_type = JSON_STRING_DYNAMIC,
1157
0
        .str_ptr = CONST_CAST(char *, in),
1158
0
    };
1159
0
    json_to_ds(&json, 0, out);
1160
0
}
1161
1162
static void
1163
json_parser_input_string(struct json_parser *p, const char *s)
1164
67.8k
{
1165
67.8k
    struct json_token token;
1166
1167
67.8k
    token.type = T_STRING;
1168
67.8k
    token.string = s;
1169
67.8k
    json_parser_input(p, &token);
1170
67.8k
}
1171
1172
static void
1173
json_lex_string(struct json_parser *p)
1174
67.9k
{
1175
67.9k
    const char *raw = ds_cstr(&p->buffer);
1176
67.9k
    if (!strchr(raw, '\\')) {
1177
52.4k
        json_parser_input_string(p, raw);
1178
52.4k
    } else {
1179
15.5k
        char *cooked;
1180
1181
15.5k
        if (json_string_unescape(raw, strlen(raw), &cooked)) {
1182
15.3k
            json_parser_input_string(p, cooked);
1183
15.3k
        } else {
1184
123
            json_error(p, "%s", cooked);
1185
123
        }
1186
1187
15.5k
        free(cooked);
1188
15.5k
    }
1189
67.9k
}
1190
1191

1192
/* Parsing. */
1193
1194
/* Parses 'string' as a JSON object or array and returns a newly allocated
1195
 * 'struct json'.  The caller must free the returned structure with
1196
 * json_destroy() when it is no longer needed.
1197
 *
1198
 * 'string' must be encoded in UTF-8.
1199
 *
1200
 * If 'string' is valid JSON, then the returned 'struct json' will be either an
1201
 * object (JSON_OBJECT) or an array (JSON_ARRAY).
1202
 *
1203
 * If 'string' is not valid JSON, then the returned 'struct json' will be a
1204
 * string (JSON_STRING) that describes the particular error encountered during
1205
 * parsing.  (This is an acceptable means of error reporting because at its top
1206
 * level JSON must be either an object or an array; a bare string is not
1207
 * valid.) */
1208
struct json *
1209
json_from_string(const char *string)
1210
3.91k
{
1211
3.91k
    struct json_parser *p = json_parser_create(JSPF_TRAILER);
1212
3.91k
    json_parser_feed(p, string, strlen(string));
1213
3.91k
    return json_parser_finish(p);
1214
3.91k
}
1215
1216
/* Parses data of JSON_SERIALIZED_OBJECT to the real JSON. */
1217
struct json *
1218
json_from_serialized_object(const struct json *json)
1219
0
{
1220
0
    return json_from_string(json_serialized_object(json));
1221
0
}
1222
1223
/* Reads the file named 'file_name', parses its contents as a JSON object or
1224
 * array, and returns a newly allocated 'struct json'.  The caller must free
1225
 * the returned structure with json_destroy() when it is no longer needed.
1226
 *
1227
 * The file must be encoded in UTF-8.
1228
 *
1229
 * See json_from_string() for return value semantics.
1230
 */
1231
struct json *
1232
json_from_file(const char *file_name)
1233
0
{
1234
0
    struct json *json;
1235
0
    FILE *stream;
1236
1237
0
    stream = fopen(file_name, "r");
1238
0
    if (!stream) {
1239
0
        return json_string_create_nocopy(
1240
0
            xasprintf("error opening \"%s\": %s", file_name,
1241
0
                      ovs_strerror(errno)));
1242
0
    }
1243
0
    json = json_from_stream(stream);
1244
0
    fclose(stream);
1245
1246
0
    return json;
1247
0
}
1248
1249
/* Parses the contents of 'stream' as a JSON object or array, and returns a
1250
 * newly allocated 'struct json'.  The caller must free the returned structure
1251
 * with json_destroy() when it is no longer needed.
1252
 *
1253
 * The file must be encoded in UTF-8.
1254
 *
1255
 * See json_from_string() for return value semantics.
1256
 */
1257
struct json *
1258
json_from_stream(FILE *stream)
1259
0
{
1260
0
    struct json_parser *p;
1261
0
    struct json *json;
1262
1263
0
    p = json_parser_create(JSPF_TRAILER);
1264
0
    for (;;) {
1265
0
        char buffer[BUFSIZ];
1266
0
        size_t n;
1267
1268
0
        n = fread(buffer, 1, sizeof buffer, stream);
1269
0
        if (!n || json_parser_feed(p, buffer, n) != n) {
1270
0
            break;
1271
0
        }
1272
0
    }
1273
0
    json = json_parser_finish(p);
1274
1275
0
    if (ferror(stream)) {
1276
0
        json_destroy(json);
1277
0
        json = json_string_create_nocopy(
1278
0
            xasprintf("error reading JSON stream: %s", ovs_strerror(errno)));
1279
0
    }
1280
1281
0
    return json;
1282
0
}
1283
1284
struct json_parser *
1285
json_parser_create(int flags)
1286
3.91k
{
1287
3.91k
    struct json_parser *p = xzalloc(sizeof *p);
1288
3.91k
    p->flags = flags;
1289
3.91k
    return p;
1290
3.91k
}
1291
1292
static inline void ALWAYS_INLINE
1293
json_parser_account_byte(struct json_parser *p, unsigned char c)
1294
73.2M
{
1295
73.2M
    p->byte_number++;
1296
73.2M
    if (OVS_UNLIKELY(c == '\n')) {
1297
208
        p->column_number = 0;
1298
208
        p->line_number++;
1299
73.2M
    } else {
1300
73.2M
        p->column_number++;
1301
73.2M
    }
1302
73.2M
}
1303
1304
size_t
1305
json_parser_feed(struct json_parser *p, const char *input, size_t n)
1306
5.32k
{
1307
5.32k
    size_t token_start = 0;
1308
5.32k
    size_t i;
1309
1310
89.3M
    for (i = 0; !p->done && i < n; ) {
1311
89.3M
        bool consumed = true;
1312
1313
89.3M
        const char *start_p = &input[token_start];
1314
89.3M
        unsigned char c = input[i];
1315
89.3M
        struct json_token token;
1316
1317
89.3M
        switch (p->lex_state) {
1318
37.1M
        case JSON_LEX_START:
1319
37.1M
            switch (c) {
1320
1.27k
            case ' ': case '\t': case '\n': case '\r':
1321
                /* Nothing to do. */
1322
1.27k
                token_start = i + 1;
1323
1.27k
                break;
1324
1325
18
            case 'a': case 'b': case 'c': case 'd': case 'e':
1326
1.52k
            case 'f': case 'g': case 'h': case 'i': case 'j':
1327
44.2k
            case 'k': case 'l': case 'm': case 'n': case 'o':
1328
46.2k
            case 'p': case 'q': case 'r': case 's': case 't':
1329
46.2k
            case 'u': case 'v': case 'w': case 'x': case 'y':
1330
46.2k
            case 'z':
1331
46.2k
                p->lex_state = JSON_LEX_KEYWORD;
1332
46.2k
                token_start = i;
1333
46.2k
                break;
1334
1335
20.9M
            case '[': case '{': case ']': case '}': case ':': case ',':
1336
20.9M
                token.type = c;
1337
20.9M
                json_parser_input(p, &token);
1338
20.9M
                token_start = i + 1;
1339
20.9M
                break;
1340
1341
25.9k
            case '-':
1342
15.0M
            case '0': case '1': case '2': case '3': case '4':
1343
16.0M
            case '5': case '6': case '7': case '8': case '9':
1344
16.0M
                p->lex_state = JSON_LEX_NUMBER;
1345
16.0M
                token_start = i;
1346
16.0M
                break;
1347
1348
68.0k
            case '"':
1349
68.0k
                p->lex_state = JSON_LEX_STRING;
1350
68.0k
                token_start = i + 1;
1351
68.0k
                break;
1352
1353
17
            default:
1354
17
                if (isprint(c)) {
1355
5
                    json_error(p, "invalid character '%c'", c);
1356
12
                } else {
1357
12
                    json_error(p, "invalid character U+%04x", c);
1358
12
                }
1359
17
                break;
1360
37.1M
            }
1361
37.1M
            break;
1362
1363
37.1M
        case JSON_LEX_KEYWORD:
1364
2.28M
            if (!isalpha((unsigned char) c)) {
1365
46.2k
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1366
46.2k
                json_lex_keyword(p);
1367
46.2k
                consumed = false;
1368
46.2k
                break;
1369
46.2k
            }
1370
2.24M
            break;
1371
1372
19.5M
        case JSON_LEX_NUMBER:
1373
19.5M
            if (!strchr(".0123456789eE-+", c)) {
1374
16.0M
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1375
16.0M
                json_lex_number(p);
1376
16.0M
                consumed = false;
1377
16.0M
                break;
1378
16.0M
            }
1379
3.43M
            break;
1380
1381
30.0M
        case JSON_LEX_STRING:
1382
30.0M
            if (c == '\\') {
1383
411k
                p->lex_state = JSON_LEX_ESCAPE;
1384
29.6M
            } else if (c == '"') {
1385
67.9k
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1386
67.9k
                json_lex_string(p);
1387
29.5M
            } else if (c < 0x20) {
1388
8
                json_error(p, "U+%04X must be escaped in quoted string", c);
1389
8
            }
1390
30.0M
            break;
1391
1392
411k
        case JSON_LEX_ESCAPE:
1393
411k
            p->lex_state = JSON_LEX_STRING;
1394
411k
            break;
1395
1396
0
        default:
1397
0
            ovs_abort(0, "unexpected lexer state");
1398
89.3M
        }
1399
1400
89.3M
        if (consumed) {
1401
73.2M
            json_parser_account_byte(p, c);
1402
73.2M
            i++;
1403
73.2M
        }
1404
89.3M
    }
1405
1406
5.32k
    if (!p->done) {
1407
3.63k
        ds_put_buffer(&p->buffer, &input[token_start], i - token_start);
1408
3.63k
    }
1409
5.32k
    return i;
1410
5.32k
}
1411
1412
bool
1413
json_parser_is_done(const struct json_parser *p)
1414
0
{
1415
0
    return p->done;
1416
0
}
1417
1418
struct json *
1419
json_parser_finish(struct json_parser *p)
1420
3.91k
{
1421
3.91k
    struct json *json;
1422
1423
3.91k
    switch (p->lex_state) {
1424
2.32k
    case JSON_LEX_START:
1425
2.32k
        break;
1426
1427
171
    case JSON_LEX_STRING:
1428
179
    case JSON_LEX_ESCAPE:
1429
179
        json_error(p, "unexpected end of input in quoted string");
1430
179
        break;
1431
1432
1.21k
    case JSON_LEX_NUMBER:
1433
1.40k
    case JSON_LEX_KEYWORD:
1434
1.40k
        json_parser_feed(p, " ", 1);
1435
1.40k
        break;
1436
3.91k
    }
1437
1438
3.91k
    if (p->parse_state == JSON_PARSE_START) {
1439
1.52k
        json_error(p, "empty input stream");
1440
2.39k
    } else if (p->parse_state != JSON_PARSE_END) {
1441
981
        json_error(p, "unexpected end of input");
1442
981
    }
1443
1444
3.91k
    if (!p->error) {
1445
1.38k
        ovs_assert(p->height == 1);
1446
1.38k
        ovs_assert(p->stack[0].json != NULL);
1447
1.38k
        json = p->stack[--p->height].json;
1448
2.53k
    } else {
1449
2.53k
        json = json_string_create_nocopy(p->error);
1450
2.53k
        p->error = NULL;
1451
2.53k
    }
1452
1453
3.91k
    json_parser_abort(p);
1454
1455
3.91k
    return json;
1456
3.91k
}
1457
1458
void
1459
json_parser_abort(struct json_parser *p)
1460
3.91k
{
1461
3.91k
    if (p) {
1462
3.91k
        ds_destroy(&p->buffer);
1463
3.91k
        if (p->height) {
1464
1.00k
            json_destroy(p->stack[0].json);
1465
1.00k
        }
1466
3.91k
        free(p->stack);
1467
3.91k
        free(p->member_name);
1468
3.91k
        free(p->error);
1469
3.91k
        free(p);
1470
3.91k
    }
1471
3.91k
}
1472
1473
static struct json_parser_node *
1474
json_parser_top(struct json_parser *p)
1475
21.1M
{
1476
21.1M
    return &p->stack[p->height - 1];
1477
21.1M
}
1478
1479
static void
1480
json_parser_put_value(struct json_parser *p, struct json *value)
1481
17.8M
{
1482
17.8M
    struct json_parser_node *node = json_parser_top(p);
1483
17.8M
    if (node->json->type == JSON_OBJECT) {
1484
48.0k
        json_object_put_nocopy(node->json, p->member_name, value);
1485
48.0k
        p->member_name = NULL;
1486
17.7M
    } else if (node->json->type == JSON_ARRAY) {
1487
17.7M
        json_array_add(node->json, value);
1488
17.7M
    } else {
1489
0
        OVS_NOT_REACHED();
1490
0
    }
1491
17.8M
}
1492
1493
static void
1494
json_parser_push(struct json_parser *p,
1495
                 struct json *new_json, enum json_parse_state new_state)
1496
1.69M
{
1497
1.69M
    if (p->height < JSON_MAX_HEIGHT) {
1498
1.69M
        struct json_parser_node *node;
1499
1500
1.69M
        if (p->height >= p->allocated_height) {
1501
8.45k
            p->stack = x2nrealloc(p->stack, &p->allocated_height,
1502
8.45k
                                  sizeof *p->stack);
1503
8.45k
        }
1504
1505
1.69M
        if (p->height > 0) {
1506
1.68M
            json_parser_put_value(p, new_json);
1507
1.68M
        }
1508
1509
1.69M
        node = &p->stack[p->height++];
1510
1.69M
        node->json = new_json;
1511
1.69M
        p->parse_state = new_state;
1512
1.69M
    } else {
1513
1
        json_destroy(new_json);
1514
1
        json_error(p, "input exceeds maximum nesting depth %d",
1515
1
                   JSON_MAX_HEIGHT);
1516
1
    }
1517
1.69M
}
1518
1519
static void
1520
json_parser_push_object(struct json_parser *p)
1521
1.30M
{
1522
1.30M
    json_parser_push(p, json_object_create(), JSON_PARSE_OBJECT_INIT);
1523
1.30M
}
1524
1525
static void
1526
json_parser_push_array(struct json_parser *p)
1527
385k
{
1528
385k
    json_parser_push(p, json_array_create_empty(), JSON_PARSE_ARRAY_INIT);
1529
385k
}
1530
1531
static void
1532
json_parse_value(struct json_parser *p, struct json_token *token,
1533
                 enum json_parse_state next_state)
1534
17.8M
{
1535
17.8M
    struct json *value;
1536
1537
17.8M
    switch (token->type) {
1538
1.46k
    case T_FALSE:
1539
1.46k
        value = json_boolean_create(false);
1540
1.46k
        break;
1541
1542
42.6k
    case T_NULL:
1543
42.6k
        value = json_null_create();
1544
42.6k
        break;
1545
1546
1.95k
    case T_TRUE:
1547
1.95k
        value = json_boolean_create(true);
1548
1.95k
        break;
1549
1550
1.30M
    case '{':
1551
1.30M
        json_parser_push_object(p);
1552
1.30M
        return;
1553
1554
384k
    case '[':
1555
384k
        json_parser_push_array(p);
1556
384k
        return;
1557
1558
16.0M
    case T_INTEGER:
1559
16.0M
        value = json_integer_create(token->integer);
1560
16.0M
        break;
1561
1562
62.4k
    case T_REAL:
1563
62.4k
        value = json_real_create(token->real);
1564
62.4k
        break;
1565
1566
19.3k
    case T_STRING:
1567
19.3k
        value = json_string_create(token->string);
1568
19.3k
        break;
1569
1570
0
    case T_EOF:
1571
1
    case '}':
1572
1
    case ']':
1573
9
    case ':':
1574
14
    case ',':
1575
14
    default:
1576
14
        json_error(p, "syntax error expecting value");
1577
14
        return;
1578
17.8M
    }
1579
1580
16.1M
    json_parser_put_value(p, value);
1581
16.1M
    p->parse_state = next_state;
1582
16.1M
}
1583
1584
static void
1585
json_parser_pop(struct json_parser *p)
1586
1.66M
{
1587
1.66M
    struct json_parser_node *node;
1588
1589
    /* Conserve memory. */
1590
1.66M
    node = json_parser_top(p);
1591
1.66M
    if (node->json->type == JSON_ARRAY) {
1592
358k
        json_array_trim(node->json);
1593
358k
    }
1594
1595
    /* Pop off the top-of-stack. */
1596
1.66M
    if (p->height == 1) {
1597
1.40k
        p->parse_state = JSON_PARSE_END;
1598
1.40k
        if (!(p->flags & JSPF_TRAILER)) {
1599
0
            p->done = true;
1600
0
        }
1601
1.65M
    } else {
1602
1.65M
        p->height--;
1603
1.65M
        node = json_parser_top(p);
1604
1.65M
        if (node->json->type == JSON_ARRAY) {
1605
1.65M
            p->parse_state = JSON_PARSE_ARRAY_NEXT;
1606
1.65M
        } else if (node->json->type == JSON_OBJECT) {
1607
4.94k
            p->parse_state = JSON_PARSE_OBJECT_NEXT;
1608
4.94k
        } else {
1609
0
            OVS_NOT_REACHED();
1610
0
        }
1611
1.65M
    }
1612
1.66M
}
1613
1614
static void
1615
json_parser_input(struct json_parser *p, struct json_token *token)
1616
37.1M
{
1617
37.1M
    switch (p->parse_state) {
1618
3.48k
    case JSON_PARSE_START:
1619
3.48k
        if (token->type == '{') {
1620
1.19k
            json_parser_push_object(p);
1621
2.28k
        } else if (token->type == '[') {
1622
1.19k
            json_parser_push_array(p);
1623
1.19k
        } else {
1624
1.09k
            json_error(p, "syntax error at beginning of input");
1625
1.09k
        }
1626
3.48k
        break;
1627
1628
24
    case JSON_PARSE_END:
1629
24
        json_error(p, "trailing garbage at end of input");
1630
24
        break;
1631
1632
1.30M
    case JSON_PARSE_OBJECT_INIT:
1633
1.30M
        if (token->type == '}') {
1634
1.29M
            json_parser_pop(p);
1635
1.29M
            break;
1636
1.29M
        }
1637
        /* Fall through. */
1638
48.1k
    case JSON_PARSE_OBJECT_NAME:
1639
48.1k
        if (token->type == T_STRING) {
1640
48.0k
            p->member_name = xstrdup(token->string);
1641
48.0k
            p->parse_state = JSON_PARSE_OBJECT_COLON;
1642
48.0k
        } else {
1643
32
            json_error(p, "syntax error parsing object expecting string");
1644
32
        }
1645
48.1k
        break;
1646
1647
48.0k
    case JSON_PARSE_OBJECT_COLON:
1648
48.0k
        if (token->type == ':') {
1649
48.0k
            p->parse_state = JSON_PARSE_OBJECT_VALUE;
1650
48.0k
        } else {
1651
12
            json_error(p, "syntax error parsing object expecting ':'");
1652
12
        }
1653
48.0k
        break;
1654
1655
48.0k
    case JSON_PARSE_OBJECT_VALUE:
1656
48.0k
        json_parse_value(p, token, JSON_PARSE_OBJECT_NEXT);
1657
48.0k
        break;
1658
1659
44.4k
    case JSON_PARSE_OBJECT_NEXT:
1660
44.4k
        if (token->type == ',') {
1661
36.5k
            p->parse_state = JSON_PARSE_OBJECT_NAME;
1662
36.5k
        } else if (token->type == '}') {
1663
7.95k
            json_parser_pop(p);
1664
7.95k
        } else {
1665
13
            json_error(p, "syntax error expecting '}' or ','");
1666
13
        }
1667
44.4k
        break;
1668
1669
385k
    case JSON_PARSE_ARRAY_INIT:
1670
385k
        if (token->type == ']') {
1671
109k
            json_parser_pop(p);
1672
109k
            break;
1673
109k
        }
1674
        /* Fall through. */
1675
17.7M
    case JSON_PARSE_ARRAY_VALUE:
1676
17.7M
        json_parse_value(p, token, JSON_PARSE_ARRAY_NEXT);
1677
17.7M
        break;
1678
1679
17.7M
    case JSON_PARSE_ARRAY_NEXT:
1680
17.7M
        if (token->type == ',') {
1681
17.4M
            p->parse_state = JSON_PARSE_ARRAY_VALUE;
1682
17.4M
        } else if (token->type == ']') {
1683
249k
            json_parser_pop(p);
1684
249k
        } else {
1685
31
            json_error(p, "syntax error expecting ']' or ','");
1686
31
        }
1687
17.7M
        break;
1688
1689
0
    default:
1690
0
        abort();
1691
37.1M
    }
1692
1693
37.1M
    p->lex_state = JSON_LEX_START;
1694
37.1M
    ds_clear(&p->buffer);
1695
37.1M
}
1696
1697
static struct json *
1698
json_create(enum json_type type)
1699
17.8M
{
1700
17.8M
    struct json *json = xmalloc(sizeof *json);
1701
17.8M
    json->type = type;
1702
17.8M
    json->count = 1;
1703
17.8M
    return json;
1704
17.8M
}
1705
1706
static void
1707
json_error(struct json_parser *p, const char *format, ...)
1708
4.35k
{
1709
4.35k
    if (!p->error) {
1710
2.53k
        struct ds msg;
1711
2.53k
        va_list args;
1712
1713
2.53k
        ds_init(&msg);
1714
2.53k
        ds_put_format(&msg, "line %d, column %d, byte %d: ",
1715
2.53k
                      p->line_number, p->column_number, p->byte_number);
1716
2.53k
        va_start(args, format);
1717
2.53k
        ds_put_format_valist(&msg, format, args);
1718
2.53k
        va_end(args);
1719
1720
2.53k
        p->error = ds_steal_cstr(&msg);
1721
1722
2.53k
        p->done = true;
1723
2.53k
    }
1724
4.35k
}
1725

1726
19.6M
#define SPACES_PER_LEVEL 2
1727
1728
struct json_serializer {
1729
    struct ds *ds;
1730
    int depth;
1731
    int flags;
1732
};
1733
1734
static void json_serialize(const struct json *, struct json_serializer *);
1735
static void json_serialize_object(const struct shash *object,
1736
                                  struct json_serializer *);
1737
static void json_serialize_array(const struct json *,
1738
                                 struct json_serializer *);
1739
static void json_serialize_string(const char *, struct ds *);
1740
1741
/* Converts 'json' to a string in JSON format, encoded in UTF-8, and returns
1742
 * that string.  The caller is responsible for freeing the returned string,
1743
 * with free(), when it is no longer needed.
1744
 *
1745
 * If 'flags' contains JSSF_PRETTY, the output is pretty-printed with each
1746
 * nesting level introducing an additional indentation.  Otherwise, the
1747
 * returned string does not contain any new-line characters.
1748
 *
1749
 * If 'flags' contains JSSF_SORT, members of objects in the output are sorted
1750
 * in bytewise lexicographic order for reproducibility.  Otherwise, members of
1751
 * objects are output in an indeterminate order.
1752
 *
1753
 * The returned string is valid JSON only if 'json' represents an array or an
1754
 * object, since a bare literal does not satisfy the JSON grammar. */
1755
char *
1756
json_to_string(const struct json *json, int flags)
1757
1.62k
{
1758
1.62k
    struct ds ds;
1759
1760
1.62k
    ds_init(&ds);
1761
1.62k
    json_to_ds(json, flags, &ds);
1762
1.62k
    return ds_steal_cstr(&ds);
1763
1.62k
}
1764
1765
/* Same as json_to_string(), but the output is appended to 'ds'. */
1766
void
1767
json_to_ds(const struct json *json, int flags, struct ds *ds)
1768
1.62k
{
1769
1.62k
    struct json_serializer s;
1770
1771
1.62k
    s.ds = ds;
1772
1.62k
    s.depth = 0;
1773
1.62k
    s.flags = flags;
1774
1.62k
    json_serialize(json, &s);
1775
1.62k
}
1776
1777
static void
1778
json_serialize(const struct json *json, struct json_serializer *s)
1779
18.3M
{
1780
18.3M
    struct ds *ds = s->ds;
1781
1782
18.3M
    switch (json->type) {
1783
42.5k
    case JSON_NULL:
1784
42.5k
        ds_put_cstr(ds, "null");
1785
42.5k
        break;
1786
1787
1.20k
    case JSON_FALSE:
1788
1.20k
        ds_put_cstr(ds, "false");
1789
1.20k
        break;
1790
1791
1.74k
    case JSON_TRUE:
1792
1.74k
        ds_put_cstr(ds, "true");
1793
1.74k
        break;
1794
1795
1.30M
    case JSON_OBJECT:
1796
1.30M
        json_serialize_object(json->object, s);
1797
1.30M
        break;
1798
1799
464k
    case JSON_ARRAY:
1800
464k
        json_serialize_array(json, s);
1801
464k
        break;
1802
1803
16.4M
    case JSON_INTEGER:
1804
16.4M
        ds_put_format(ds, "%lld", json->integer);
1805
16.4M
        break;
1806
1807
64.2k
    case JSON_REAL:
1808
64.2k
        ds_put_format(ds, "%.*g", DBL_DIG, json->real);
1809
64.2k
        break;
1810
1811
17.8k
    case JSON_STRING:
1812
17.8k
        json_serialize_string(json_string(json), ds);
1813
17.8k
        break;
1814
1815
0
    case JSON_SERIALIZED_OBJECT:
1816
0
        ds_put_cstr(ds, json_serialized_object(json));
1817
0
        break;
1818
1819
0
    case JSON_N_TYPES:
1820
0
    default:
1821
0
        OVS_NOT_REACHED();
1822
18.3M
    }
1823
18.3M
}
1824
1825
static void
1826
indent_line(struct json_serializer *s)
1827
19.6M
{
1828
19.6M
    if (s->flags & JSSF_PRETTY) {
1829
19.6M
        ds_put_char(s->ds, '\n');
1830
19.6M
        ds_put_char_multiple(s->ds, ' ', SPACES_PER_LEVEL * s->depth);
1831
19.6M
    }
1832
19.6M
}
1833
1834
static void
1835
json_serialize_object_member(size_t i, const struct shash_node *node,
1836
                             struct json_serializer *s)
1837
38.6k
{
1838
38.6k
    struct ds *ds = s->ds;
1839
1840
38.6k
    if (i) {
1841
28.6k
        ds_put_char(ds, ',');
1842
28.6k
        indent_line(s);
1843
28.6k
    }
1844
1845
38.6k
    json_serialize_string(node->name, ds);
1846
38.6k
    ds_put_char(ds, ':');
1847
38.6k
    if (s->flags & JSSF_PRETTY) {
1848
38.6k
        ds_put_char(ds, ' ');
1849
38.6k
    }
1850
38.6k
    json_serialize(node->data, s);
1851
38.6k
}
1852
1853
static void
1854
json_serialize_object(const struct shash *object, struct json_serializer *s)
1855
1.30M
{
1856
1.30M
    struct ds *ds = s->ds;
1857
1858
1.30M
    ds_put_char(ds, '{');
1859
1860
1.30M
    s->depth++;
1861
1.30M
    indent_line(s);
1862
1863
1.30M
    if (s->flags & JSSF_YIELD) {
1864
0
        cooperative_multitasking_yield();
1865
0
    }
1866
1867
1.30M
    if (s->flags & JSSF_SORT) {
1868
1.30M
        const struct shash_node **nodes;
1869
1.30M
        size_t n, i;
1870
1871
1.30M
        nodes = shash_sort(object);
1872
1.30M
        n = shash_count(object);
1873
1.34M
        for (i = 0; i < n; i++) {
1874
38.6k
            json_serialize_object_member(i, nodes[i], s);
1875
38.6k
        }
1876
1.30M
        free(nodes);
1877
1.30M
    } else {
1878
0
        struct shash_node *node;
1879
0
        size_t i;
1880
1881
0
        i = 0;
1882
0
        SHASH_FOR_EACH (node, object) {
1883
0
            json_serialize_object_member(i++, node, s);
1884
0
        }
1885
0
    }
1886
1887
1.30M
    ds_put_char(ds, '}');
1888
1.30M
    s->depth--;
1889
1.30M
}
1890
1891
static void
1892
json_serialize_array(const struct json *json, struct json_serializer *s)
1893
464k
{
1894
464k
    size_t i, n = json_array_size(json);
1895
464k
    struct ds *ds = s->ds;
1896
1897
464k
    ds_put_char(ds, '[');
1898
464k
    s->depth++;
1899
1900
464k
    if (s->flags & JSSF_YIELD) {
1901
0
        cooperative_multitasking_yield();
1902
0
    }
1903
1904
464k
    if (n > 0) {
1905
257k
        indent_line(s);
1906
1907
18.5M
        for (i = 0; i < n; i++) {
1908
18.3M
            if (i) {
1909
18.0M
                ds_put_char(ds, ',');
1910
18.0M
                indent_line(s);
1911
18.0M
            }
1912
18.3M
            json_serialize(json_array_at(json, i), s);
1913
18.3M
        }
1914
257k
    }
1915
1916
464k
    s->depth--;
1917
464k
    ds_put_char(ds, ']');
1918
464k
}
1919
1920
static const char *chars_escaping[256] = {
1921
        "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", "\\u0007",
1922
        "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", "\\u000e", "\\u000f",
1923
        "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", "\\u0015", "\\u0016", "\\u0017",
1924
        "\\u0018", "\\u0019", "\\u001a", "\\u001b", "\\u001c", "\\u001d", "\\u001e", "\\u001f",
1925
        " ", "!", "\\\"", "#", "$", "%", "&", "'",
1926
        "(", ")", "*", "+", ",", "-", ".", "/",
1927
        "0", "1", "2", "3", "4", "5", "6", "7",
1928
        "8", "9", ":", ";", "<", "=", ">", "?",
1929
        "@", "A", "B", "C", "D", "E", "F", "G",
1930
        "H", "I", "J", "K", "L", "M", "N", "O",
1931
        "P", "Q", "R", "S", "T", "U", "V", "W",
1932
        "X", "Y", "Z", "[", "\\\\", "]", "^", "_",
1933
        "`", "a", "b", "c", "d", "e", "f", "g",
1934
        "h", "i", "j", "k", "l", "m", "n", "o",
1935
        "p", "q", "r", "s", "t", "u", "v", "w",
1936
        "x", "y", "z", "{", "|", "}", "~", "\x7f",
1937
        "\x80", "\x81", "\x82", "\x83", "\x84", "\x85", "\x86", "\x87",
1938
        "\x88", "\x89", "\x8a", "\x8b", "\x8c", "\x8d", "\x8e", "\x8f",
1939
        "\x90", "\x91", "\x92", "\x93", "\x94", "\x95", "\x96", "\x97",
1940
        "\x98", "\x99", "\x9a", "\x9b", "\x9c", "\x9d", "\x9e", "\x9f",
1941
        "\xa0", "\xa1", "\xa2", "\xa3", "\xa4", "\xa5", "\xa6", "\xa7",
1942
        "\xa8", "\xa9", "\xaa", "\xab", "\xac", "\xad", "\xae", "\xaf",
1943
        "\xb0", "\xb1", "\xb2", "\xb3", "\xb4", "\xb5", "\xb6", "\xb7",
1944
        "\xb8", "\xb9", "\xba", "\xbb", "\xbc", "\xbd", "\xbe", "\xbf",
1945
        "\xc0", "\xc1", "\xc2", "\xc3", "\xc4", "\xc5", "\xc6", "\xc7",
1946
        "\xc8", "\xc9", "\xca", "\xcb", "\xcc", "\xcd", "\xce", "\xcf",
1947
        "\xd0", "\xd1", "\xd2", "\xd3", "\xd4", "\xd5", "\xd6", "\xd7",
1948
        "\xd8", "\xd9", "\xda", "\xdb", "\xdc", "\xdd", "\xde", "\xdf",
1949
        "\xe0", "\xe1", "\xe2", "\xe3", "\xe4", "\xe5", "\xe6", "\xe7",
1950
        "\xe8", "\xe9", "\xea", "\xeb", "\xec", "\xed", "\xee", "\xef",
1951
        "\xf0", "\xf1", "\xf2", "\xf3", "\xf4", "\xf5", "\xf6", "\xf7",
1952
        "\xf8", "\xf9", "\xfa", "\xfb", "\xfc", "\xfd", "\xfe", "\xff"
1953
};
1954
1955
static void
1956
json_serialize_string(const char *string, struct ds *ds)
1957
56.5k
{
1958
56.5k
    uint8_t c;
1959
56.5k
    uint8_t c2;
1960
56.5k
    size_t count;
1961
56.5k
    const char *escape;
1962
56.5k
    const char *start;
1963
1964
56.5k
    ds_put_char(ds, '"');
1965
56.5k
    count = 0;
1966
56.5k
    start = string;
1967
16.6M
    while ((c = *string++) != '\0') {
1968
16.5M
        if (c >= ' ' && c != '"' && c != '\\') {
1969
15.8M
            count++;
1970
15.8M
        } else {
1971
717k
            if (count) {
1972
69.9k
                ds_put_buffer(ds, start, count);
1973
69.9k
                count = 0;
1974
69.9k
            }
1975
717k
            start = string;
1976
717k
            escape = chars_escaping[c];
1977
2.16M
            while ((c2 = *escape++) != '\0') {
1978
1.44M
                ds_put_char(ds, c2);
1979
1.44M
            }
1980
717k
        }
1981
16.5M
    }
1982
56.5k
    if (count) {
1983
44.6k
        ds_put_buffer(ds, start, count);
1984
44.6k
    }
1985
56.5k
    ds_put_char(ds, '"');
1986
56.5k
}