Coverage Report

Created: 2025-09-05 06:24

/src/openvswitch/lib/json.c
Line
Count
Source (jump to first uncovered line)
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.24M
#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
72.0k
{
169
72.0k
    return json_create(JSON_NULL);
170
72.0k
}
171
172
struct json *
173
json_boolean_create(bool b)
174
3.90k
{
175
3.90k
    return json_create(b ? JSON_TRUE : JSON_FALSE);
176
3.90k
}
177
178
struct json *
179
json_string_create_nocopy(char *s)
180
2.53k
{
181
2.53k
    struct json *json = json_create(JSON_STRING);
182
2.53k
    json->storage_type = JSON_STRING_DYNAMIC;
183
2.53k
    json->str_ptr = s;
184
2.53k
    return json;
185
2.53k
}
186
187
struct json *
188
json_string_create(const char *s)
189
18.3k
{
190
18.3k
    struct json *json = json_create(JSON_STRING);
191
18.3k
    size_t length = strlen(s);
192
193
18.3k
    if (length <= JSON_STRING_INLINE_LEN) {
194
17.7k
        json->storage_type = JSON_STRING_INLINE;
195
17.7k
        memcpy(json->str, s, length);
196
17.7k
        json->str[length] = '\0';
197
17.7k
    } else {
198
591
        json->storage_type = JSON_STRING_DYNAMIC;
199
591
        json->str_ptr = xmemdup0(s, length);
200
591
    }
201
18.3k
    return json;
202
18.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
422k
{
228
422k
    struct json *json = json_create(JSON_ARRAY);
229
422k
    json->storage_type = JSON_ARRAY_DYNAMIC;
230
422k
    json->array.elements = NULL;
231
422k
    json->array.size = 0;
232
422k
    json->array.allocated = 0;
233
422k
    return json;
234
422k
}
235
236
void
237
json_array_add(struct json *array_, struct json *element)
238
18.1M
{
239
18.1M
    switch (array_->storage_type) {
240
18.1M
    case JSON_ARRAY_DYNAMIC:
241
18.1M
        if (!array_->array.size) {
242
312k
            array_->storage_type = JSON_ARRAY_INLINE_1;
243
312k
            array_->elements[0] = element;
244
312k
            return;
245
312k
        }
246
17.8M
        break;
247
248
17.8M
    case JSON_ARRAY_INLINE_1:
249
32.6k
    case JSON_ARRAY_INLINE_2:
250
32.6k
        array_->elements[array_->storage_type - JSON_ARRAY_DYNAMIC] = element;
251
32.6k
        array_->storage_type++;
252
32.6k
        return;
253
254
7.10k
    case JSON_ARRAY_INLINE_3: {
255
7.10k
        struct json **elements = xmalloc(4 * sizeof *elements);
256
257
7.10k
        memcpy(elements, array_->elements, 3 * sizeof array_->elements[0]);
258
7.10k
        array_->array.elements = elements;
259
7.10k
        array_->array.elements[3] = element;
260
7.10k
        array_->array.size = 4;
261
7.10k
        array_->array.allocated = 4;
262
7.10k
        array_->storage_type = JSON_ARRAY_DYNAMIC;
263
7.10k
        return;
264
23.1k
    }
265
266
0
    case JSON_STRING_DYNAMIC:
267
0
    case JSON_STRING_INLINE:
268
0
    default:
269
0
        OVS_NOT_REACHED();
270
18.1M
    }
271
272
17.8M
    struct json_array *array = &array_->array;
273
17.8M
    if (array->size >= array->allocated) {
274
18.7k
        array->elements = x2nrealloc(array->elements, &array->allocated,
275
18.7k
                                     sizeof *array->elements);
276
18.7k
    }
277
17.8M
    array->elements[array->size++] = element;
278
17.8M
}
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
394k
{
317
394k
    if (array_->storage_type != JSON_ARRAY_DYNAMIC) {
318
278k
        return;
319
278k
    }
320
321
116k
    struct json_array *array = &array_->array;
322
116k
    if (array->size < array->allocated) {
323
5.25k
        array->allocated = array->size;
324
5.25k
        array->elements = xrealloc(array->elements,
325
5.25k
                                   array->size * sizeof *array->elements);
326
5.25k
    }
327
116k
}
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
826k
{
394
826k
    struct json *json = json_create(JSON_OBJECT);
395
826k
    json->object = xmalloc(sizeof *json->object);
396
826k
    shash_init(json->object);
397
826k
    return json;
398
826k
}
399
400
struct json *
401
json_integer_create(long long int integer)
402
16.7M
{
403
16.7M
    struct json *json = json_create(JSON_INTEGER);
404
16.7M
    json->integer = integer;
405
16.7M
    return json;
406
16.7M
}
407
408
struct json *
409
json_real_create(double real)
410
63.3k
{
411
63.3k
    struct json *json = json_create(JSON_REAL);
412
63.3k
    json->real = real;
413
63.3k
    return json;
414
63.3k
}
415
416
void
417
json_object_put(struct json *json, const char *name, struct json *value)
418
717
{
419
717
    json_destroy(shash_replace(json->object, name, value));
420
717
}
421
422
void
423
json_object_put_nocopy(struct json *json, char *name, struct json *value)
424
32.0k
{
425
32.0k
    json_destroy(shash_replace_nocopy(json->object, name, value));
426
32.0k
}
427
428
void
429
json_object_put_string(struct json *json, const char *name, const char *value)
430
0
{
431
0
    json_object_put(json, name, json_string_create(value));
432
0
}
433
434
void OVS_PRINTF_FORMAT(3, 4)
435
json_object_put_format(struct json *json,
436
                       const char *name, const char *format, ...)
437
0
{
438
0
    va_list args;
439
0
    va_start(args, format);
440
0
    json_object_put(json, name,
441
0
                    json_string_create_nocopy(xvasprintf(format, args)));
442
0
    va_end(args);
443
0
}
444
445
void json_object_put_uuid(struct json *json,
446
                          const char *name, const struct uuid *uuid)
447
0
{
448
0
    json_object_put(json, name, json_string_create_uuid(uuid));
449
0
}
450
451
const char *
452
json_string(const struct json *json)
453
17.1k
{
454
17.1k
    ovs_assert(json->type == JSON_STRING);
455
17.1k
    return json->storage_type == JSON_STRING_DYNAMIC
456
17.1k
           ? json->str_ptr : json->str;
457
17.1k
}
458
459
const char *
460
json_serialized_object(const struct json *json)
461
0
{
462
0
    ovs_assert(json->type == JSON_SERIALIZED_OBJECT);
463
0
    return json->str_ptr;
464
0
}
465
466
size_t
467
json_array_size(const struct json *json)
468
921k
{
469
921k
    ovs_assert(json->type == JSON_ARRAY);
470
921k
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
471
334k
        return json->array.size;
472
334k
    }
473
587k
    return json->storage_type - JSON_ARRAY_DYNAMIC;
474
921k
}
475
476
const struct json *
477
json_array_at(const struct json *json, size_t index)
478
36.8M
{
479
36.8M
    ovs_assert(json->type == JSON_ARRAY);
480
481
36.8M
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
482
36.2M
        if (json->array.size <= index) {
483
0
            return NULL;
484
0
        }
485
36.2M
        return json->array.elements[index];
486
36.2M
    }
487
488
624k
    if (json->storage_type - JSON_ARRAY_DYNAMIC <= index) {
489
0
        return NULL;
490
0
    }
491
624k
    return json->elements[index];
492
624k
}
493
494
struct shash *
495
json_object(const struct json *json)
496
702
{
497
702
    ovs_assert(json->type == JSON_OBJECT);
498
702
    return CONST_CAST(struct shash *, json->object);
499
702
}
500
501
bool
502
json_boolean(const struct json *json)
503
0
{
504
0
    ovs_assert(json->type == JSON_TRUE || json->type == JSON_FALSE);
505
0
    return json->type == JSON_TRUE;
506
0
}
507
508
double
509
json_real(const struct json *json)
510
0
{
511
0
    ovs_assert(json->type == JSON_REAL || json->type == JSON_INTEGER);
512
0
    return json->type == JSON_REAL ? json->real : json->integer;
513
0
}
514
515
int64_t
516
json_integer(const struct json *json)
517
0
{
518
0
    ovs_assert(json->type == JSON_INTEGER);
519
0
    return json->integer;
520
0
}
521

522
static void json_destroy_object(struct shash *object, bool yield);
523
static void json_destroy_array(struct json *json, bool yield);
524
525
/* Frees 'json' and everything it points to, recursively. */
526
void
527
json_destroy__(struct json *json, bool yield)
528
18.1M
{
529
18.1M
    switch (json->type) {
530
826k
    case JSON_OBJECT:
531
826k
        json_destroy_object(json->object, yield);
532
826k
        break;
533
534
422k
    case JSON_ARRAY:
535
422k
        json_destroy_array(json, yield);
536
422k
        break;
537
538
20.8k
    case JSON_STRING:
539
20.8k
        if (json->storage_type == JSON_STRING_DYNAMIC) {
540
3.13k
            free(json->str_ptr);
541
3.13k
        }
542
20.8k
        break;
543
544
0
    case JSON_SERIALIZED_OBJECT:
545
0
        free(json->str_ptr);
546
0
        break;
547
548
72.0k
    case JSON_NULL:
549
73.5k
    case JSON_FALSE:
550
75.9k
    case JSON_TRUE:
551
16.8M
    case JSON_INTEGER:
552
16.9M
    case JSON_REAL:
553
16.9M
        break;
554
555
0
    case JSON_N_TYPES:
556
0
        OVS_NOT_REACHED();
557
18.1M
    }
558
18.1M
    free(json);
559
18.1M
}
560
561
static void
562
json_destroy_object(struct shash *object, bool yield)
563
826k
{
564
826k
    struct shash_node *node;
565
566
826k
    if (yield) {
567
0
        cooperative_multitasking_yield();
568
0
    }
569
570
826k
    SHASH_FOR_EACH_SAFE (node, object) {
571
30.2k
        struct json *value = node->data;
572
573
30.2k
        if (yield) {
574
0
            json_destroy_with_yield(value);
575
30.2k
        } else {
576
30.2k
            json_destroy(value);
577
30.2k
        }
578
30.2k
        shash_delete(object, node);
579
30.2k
    }
580
826k
    shash_destroy(object);
581
826k
    free(object);
582
826k
}
583
584
static void
585
json_destroy_array(struct json *json, bool yield)
586
422k
{
587
422k
    size_t i, n = json_array_size(json);
588
589
422k
    if (yield) {
590
0
        cooperative_multitasking_yield();
591
0
    }
592
593
18.5M
    for (i = 0; i < n; i++) {
594
18.1M
        if (yield) {
595
0
            json_destroy_with_yield(
596
0
                CONST_CAST(struct json *, json_array_at(json, i)));
597
18.1M
        } else {
598
18.1M
            json_destroy(CONST_CAST(struct json *, json_array_at(json, i)));
599
18.1M
        }
600
18.1M
    }
601
422k
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
602
116k
        free(json->array.elements);
603
116k
    }
604
422k
}
605

606
static struct json *json_deep_clone_object(const struct shash *object);
607
static struct json *json_deep_clone_array(const struct json *);
608
609
/* Returns a deep copy of 'json'. */
610
struct json *
611
json_deep_clone(const struct json *json)
612
0
{
613
0
    switch (json->type) {
614
0
    case JSON_OBJECT:
615
0
        return json_deep_clone_object(json->object);
616
617
0
    case JSON_ARRAY:
618
0
        return json_deep_clone_array(json);
619
620
0
    case JSON_STRING:
621
0
        return json_string_create(json_string(json));
622
623
0
    case JSON_SERIALIZED_OBJECT:
624
0
        return json_serialized_object_create(json);
625
626
0
    case JSON_NULL:
627
0
    case JSON_FALSE:
628
0
    case JSON_TRUE:
629
0
        return json_create(json->type);
630
631
0
    case JSON_INTEGER:
632
0
        return json_integer_create(json->integer);
633
634
0
    case JSON_REAL:
635
0
        return json_real_create(json->real);
636
637
0
    case JSON_N_TYPES:
638
0
    default:
639
0
        OVS_NOT_REACHED();
640
0
    }
641
0
}
642
643
struct json *
644
json_nullable_clone(const struct json *json)
645
0
{
646
0
    return json ? json_clone(json) : NULL;
647
0
}
648
649
static struct json *
650
json_deep_clone_object(const struct shash *object)
651
0
{
652
0
    struct shash_node *node;
653
0
    struct json *json;
654
655
0
    json = json_object_create();
656
0
    SHASH_FOR_EACH (node, object) {
657
0
        struct json *value = node->data;
658
0
        json_object_put(json, node->name, json_deep_clone(value));
659
0
    }
660
0
    return json;
661
0
}
662
663
static struct json *
664
json_deep_clone_array(const struct json *json)
665
0
{
666
0
    struct json **elements;
667
0
    size_t i, n;
668
669
0
    n = json_array_size(json);
670
0
    switch (n) {
671
0
    case 0:
672
0
        return json_array_create_empty();
673
0
    case 1:
674
0
        return json_array_create_1(json_deep_clone(json_array_at(json, 0)));
675
0
    case 2:
676
0
        return json_array_create_2(json_deep_clone(json_array_at(json, 0)),
677
0
                                   json_deep_clone(json_array_at(json, 1)));
678
0
    case 3:
679
0
        return json_array_create_3(json_deep_clone(json_array_at(json, 0)),
680
0
                                   json_deep_clone(json_array_at(json, 1)),
681
0
                                   json_deep_clone(json_array_at(json, 2)));
682
0
    default:
683
0
        break;
684
0
    }
685
686
0
    elements = xmalloc(n * sizeof *elements);
687
0
    for (i = 0; i < n; i++) {
688
0
        elements[i] = json_deep_clone(json_array_at(json, i));
689
0
    }
690
0
    return json_array_create(elements, n);
691
0
}
692

693
static size_t
694
json_hash_object(const struct shash *object, size_t basis)
695
0
{
696
0
    const struct shash_node **nodes;
697
0
    size_t n, i;
698
699
0
    nodes = shash_sort(object);
700
0
    n = shash_count(object);
701
0
    for (i = 0; i < n; i++) {
702
0
        const struct shash_node *node = nodes[i];
703
0
        basis = hash_string(node->name, basis);
704
0
        basis = json_hash(node->data, basis);
705
0
    }
706
0
    free(nodes);
707
0
    return basis;
708
0
}
709
710
static size_t
711
json_hash_array(const struct json *json, size_t basis)
712
0
{
713
0
    size_t i, n = json_array_size(json);
714
715
0
    basis = hash_int(n, basis);
716
0
    for (i = 0; i < n; i++) {
717
0
        basis = json_hash(json_array_at(json, i), basis);
718
0
    }
719
0
    return basis;
720
0
}
721
722
size_t
723
json_hash(const struct json *json, size_t basis)
724
0
{
725
0
    switch (json->type) {
726
0
    case JSON_OBJECT:
727
0
        return json_hash_object(json->object, basis);
728
729
0
    case JSON_ARRAY:
730
0
        return json_hash_array(json, basis);
731
732
0
    case JSON_STRING:
733
0
        return hash_string(json_string(json), basis);
734
735
0
    case JSON_SERIALIZED_OBJECT:
736
0
        return hash_string(json_serialized_object(json), basis);
737
738
0
    case JSON_NULL:
739
0
    case JSON_FALSE:
740
0
    case JSON_TRUE:
741
0
        return hash_int(json->type << 8, basis);
742
743
0
    case JSON_INTEGER:
744
0
        return hash_int(json->integer, basis);
745
746
0
    case JSON_REAL:
747
0
        return hash_double(json->real, basis);
748
749
0
    case JSON_N_TYPES:
750
0
    default:
751
0
        OVS_NOT_REACHED();
752
0
    }
753
0
}
754
755
static bool
756
json_equal_object(const struct shash *a, const struct shash *b)
757
0
{
758
0
    struct shash_node *a_node;
759
760
0
    if (shash_count(a) != shash_count(b)) {
761
0
        return false;
762
0
    }
763
764
0
    SHASH_FOR_EACH (a_node, a) {
765
0
        struct shash_node *b_node = shash_find(b, a_node->name);
766
0
        if (!b_node || !json_equal(a_node->data, b_node->data)) {
767
0
            return false;
768
0
        }
769
0
    }
770
771
0
    return true;
772
0
}
773
774
static bool
775
json_equal_array(const struct json *a, const struct json *b)
776
0
{
777
0
    size_t i, n = json_array_size(a);
778
779
0
    if (n != json_array_size(b)) {
780
0
        return false;
781
0
    }
782
783
0
    for (i = 0; i < n; i++) {
784
0
        if (!json_equal(json_array_at(a, i), json_array_at(b, i))) {
785
0
            return false;
786
0
        }
787
0
    }
788
789
0
    return true;
790
0
}
791
792
bool
793
json_equal(const struct json *a, const struct json *b)
794
0
{
795
0
    if (a == b) {
796
0
        return true;
797
0
    } else if (!a || !b) {
798
0
        return false;
799
0
    } else if (a->type != b->type) {
800
0
        return false;
801
0
    }
802
803
0
    switch (a->type) {
804
0
    case JSON_OBJECT:
805
0
        return json_equal_object(a->object, b->object);
806
807
0
    case JSON_ARRAY:
808
0
        return json_equal_array(a, b);
809
810
0
    case JSON_STRING:
811
0
        return !strcmp(json_string(a), json_string(b));
812
813
0
    case JSON_SERIALIZED_OBJECT:
814
0
        return !strcmp(json_serialized_object(a), json_serialized_object(b));
815
816
0
    case JSON_NULL:
817
0
    case JSON_FALSE:
818
0
    case JSON_TRUE:
819
0
        return true;
820
821
0
    case JSON_INTEGER:
822
0
        return a->integer == b->integer;
823
824
0
    case JSON_REAL:
825
0
        return a->real == b->real;
826
827
0
    case JSON_N_TYPES:
828
0
    default:
829
0
        OVS_NOT_REACHED();
830
0
    }
831
0
}
832

833
/* Lexical analysis. */
834
835
static void
836
json_lex_keyword(struct json_parser *p)
837
75.8k
{
838
75.8k
    struct json_token token;
839
75.8k
    const char *s;
840
841
75.8k
    s = ds_cstr(&p->buffer);
842
75.8k
    if (!strcmp(s, "false")) {
843
1.46k
        token.type = T_FALSE;
844
74.4k
    } else if (!strcmp(s, "true")) {
845
2.45k
        token.type = T_TRUE;
846
71.9k
    } else if (!strcmp(s, "null")) {
847
71.8k
        token.type = T_NULL;
848
71.8k
    } else {
849
134
        json_error(p, "invalid keyword '%s'", s);
850
134
        return;
851
134
    }
852
75.7k
    json_parser_input(p, &token);
853
75.7k
}
854
855
static void
856
json_lex_number(struct json_parser *p)
857
16.8M
{
858
16.8M
    const char *cp = ds_cstr(&p->buffer);
859
16.8M
    unsigned long long int significand = 0;
860
16.8M
    struct json_token token;
861
16.8M
    bool imprecise = false;
862
16.8M
    bool negative = false;
863
16.8M
    int pow10 = 0;
864
865
    /* Leading minus sign. */
866
16.8M
    if (*cp == '-') {
867
28.7k
        negative = true;
868
28.7k
        cp++;
869
28.7k
    }
870
871
    /* At least one integer digit, but 0 may not be used as a leading digit for
872
     * a longer number. */
873
16.8M
    significand = 0;
874
16.8M
    if (*cp == '0') {
875
9.50M
        cp++;
876
9.50M
        if (isdigit((unsigned char) *cp)) {
877
1
            json_error(p, "leading zeros not allowed");
878
1
            return;
879
1
        }
880
9.50M
    } else if (isdigit((unsigned char) *cp)) {
881
10.9M
        do {
882
10.9M
            if (significand <= ULLONG_MAX / 10) {
883
9.83M
                significand = significand * 10 + (*cp - '0');
884
9.83M
            } else {
885
1.11M
                pow10++;
886
1.11M
                if (*cp != '0') {
887
75.1k
                    imprecise = true;
888
75.1k
                }
889
1.11M
            }
890
10.9M
            cp++;
891
10.9M
        } while (isdigit((unsigned char) *cp));
892
7.35M
    } else {
893
10
        json_error(p, "'-' must be followed by digit");
894
10
        return;
895
10
    }
896
897
    /* Optional fraction. */
898
16.8M
    if (*cp == '.') {
899
44.7k
        cp++;
900
44.7k
        if (!isdigit((unsigned char) *cp)) {
901
3
            json_error(p, "decimal point must be followed by digit");
902
3
            return;
903
3
        }
904
57.6k
        do {
905
57.6k
            if (significand <= ULLONG_MAX / 10) {
906
55.8k
                significand = significand * 10 + (*cp - '0');
907
55.8k
                pow10--;
908
55.8k
            } else if (*cp != '0') {
909
1.30k
                imprecise = true;
910
1.30k
            }
911
57.6k
            cp++;
912
57.6k
        } while (isdigit((unsigned char) *cp));
913
44.7k
    }
914
915
    /* Optional exponent. */
916
16.8M
    if (*cp == 'e' || *cp == 'E') {
917
5.70k
        bool negative_exponent = false;
918
5.70k
        int exponent;
919
920
5.70k
        cp++;
921
5.70k
        if (*cp == '+') {
922
2.06k
            cp++;
923
3.64k
        } else if (*cp == '-') {
924
755
            negative_exponent = true;
925
755
            cp++;
926
755
        }
927
928
5.70k
        if (!isdigit((unsigned char) *cp)) {
929
29
            json_error(p, "exponent must contain at least one digit");
930
29
            return;
931
29
        }
932
933
5.67k
        exponent = 0;
934
11.1k
        do {
935
11.1k
            if (exponent >= INT_MAX / 10) {
936
3
                goto bad_exponent;
937
3
            }
938
11.1k
            exponent = exponent * 10 + (*cp - '0');
939
11.1k
            cp++;
940
11.1k
        } while (isdigit((unsigned char) *cp));
941
942
5.67k
        if (negative_exponent) {
943
749
            if (pow10 < INT_MIN + exponent) {
944
1
                goto bad_exponent;
945
1
            }
946
748
            pow10 -= exponent;
947
4.92k
        } else {
948
4.92k
            if (pow10 > INT_MAX - exponent) {
949
20
                goto bad_exponent;
950
20
            }
951
4.90k
            pow10 += exponent;
952
4.90k
        }
953
5.67k
    }
954
955
16.8M
    if (*cp != '\0') {
956
2
        json_error(p, "syntax error in number");
957
2
        return;
958
2
    }
959
960
    /* Figure out number.
961
     *
962
     * We suppress negative zeros as a matter of policy. */
963
16.8M
    if (!significand) {
964
9.49M
        token.type = T_INTEGER;
965
9.49M
        token.integer = 0;
966
9.49M
        json_parser_input(p, &token);
967
9.49M
        return;
968
9.49M
    }
969
970
7.35M
    if (!imprecise) {
971
7.38M
        while (pow10 > 0 && significand < ULLONG_MAX / 10) {
972
53.9k
            significand *= 10;
973
53.9k
            pow10--;
974
53.9k
        }
975
7.33M
        while (pow10 < 0 && significand % 10 == 0) {
976
6.31k
            significand /= 10;
977
6.31k
            pow10++;
978
6.31k
        }
979
7.32M
        if (pow10 == 0
980
7.32M
            && significand <= (negative
981
7.29M
                               ? (unsigned long long int) LLONG_MAX + 1
982
7.29M
                               : LLONG_MAX)) {
983
7.29M
            token.type = T_INTEGER;
984
7.29M
            token.integer = negative ? -significand : significand;
985
7.29M
            json_parser_input(p, &token);
986
7.29M
            return;
987
7.29M
        }
988
7.32M
    }
989
990
63.9k
    token.type = T_REAL;
991
63.9k
    if (!str_to_double(ds_cstr(&p->buffer), &token.real)) {
992
65
        json_error(p, "number outside valid range");
993
65
        return;
994
65
    }
995
    /* Suppress negative zero. */
996
63.8k
    if (token.real == 0) {
997
313
        token.real = 0;
998
313
    }
999
63.8k
    json_parser_input(p, &token);
1000
63.8k
    return;
1001
1002
24
bad_exponent:
1003
24
    json_error(p, "exponent outside valid range");
1004
24
}
1005
1006
static const char *
1007
json_lex_4hex(const char *cp, const char *end, int *valuep)
1008
3.82k
{
1009
3.82k
    unsigned int value;
1010
3.82k
    bool ok;
1011
1012
3.82k
    if (cp + 4 > end) {
1013
4
        return "quoted string ends within \\u escape";
1014
4
    }
1015
1016
3.82k
    value = hexits_value(cp, 4, &ok);
1017
3.82k
    if (!ok) {
1018
20
        return "malformed \\u escape";
1019
20
    }
1020
3.80k
    if (!value) {
1021
6
        return "null bytes not supported in quoted strings";
1022
6
    }
1023
3.79k
    *valuep = value;
1024
3.79k
    return NULL;
1025
3.80k
}
1026
1027
static const char *
1028
json_lex_unicode(const char *cp, const char *end, struct ds *out)
1029
2.88k
{
1030
2.88k
    const char *error;
1031
2.88k
    int c0, c1;
1032
1033
2.88k
    error = json_lex_4hex(cp, end, &c0);
1034
2.88k
    if (error) {
1035
25
        ds_clear(out);
1036
25
        ds_put_cstr(out, error);
1037
25
        return NULL;
1038
25
    }
1039
2.85k
    cp += 4;
1040
2.85k
    if (!uc_is_leading_surrogate(c0)) {
1041
1.87k
        ds_put_utf8(out, c0);
1042
1.87k
        return cp;
1043
1.87k
    }
1044
1045
980
    if (cp + 2 > end || *cp++ != '\\' || *cp++ != 'u') {
1046
39
        ds_clear(out);
1047
39
        ds_put_cstr(out, "malformed escaped surrogate pair");
1048
39
        return NULL;
1049
39
    }
1050
1051
941
    error = json_lex_4hex(cp, end, &c1);
1052
941
    if (error) {
1053
5
        ds_clear(out);
1054
5
        ds_put_cstr(out, error);
1055
5
        return NULL;
1056
5
    }
1057
936
    cp += 4;
1058
936
    if (!uc_is_trailing_surrogate(c1)) {
1059
28
        ds_clear(out);
1060
28
        ds_put_cstr(out, "second half of escaped surrogate pair is not "
1061
28
                    "trailing surrogate");
1062
28
        return NULL;
1063
28
    }
1064
1065
908
    ds_put_utf8(out, utf16_decode_surrogate_pair(c0, c1));
1066
908
    return cp;
1067
936
}
1068
1069
bool
1070
json_string_unescape(const char *in, size_t in_len, char **outp)
1071
15.4k
{
1072
15.4k
    const char *end = in + in_len;
1073
15.4k
    bool ok = false;
1074
15.4k
    struct ds out;
1075
1076
15.4k
    ds_init(&out);
1077
15.4k
    ds_reserve(&out, in_len);
1078
24.1M
    while (in < end) {
1079
24.1M
        if (*in == '"') {
1080
0
            ds_clear(&out);
1081
0
            ds_put_cstr(&out, "quoted string may not include unescaped \"");
1082
0
            goto exit;
1083
0
        }
1084
24.1M
        if (*in != '\\') {
1085
23.7M
            ds_put_char(&out, *in++);
1086
23.7M
            continue;
1087
23.7M
        }
1088
1089
337k
        in++;
1090
337k
        if (in >= end) {
1091
            /* The JSON parser will never trigger this message, because its
1092
             * lexer will never pass in a string that ends in a single
1093
             * backslash, but json_string_unescape() has other callers that
1094
             * are not as careful.*/
1095
0
            ds_clear(&out);
1096
0
            ds_put_cstr(&out, "quoted string may not end with backslash");
1097
0
            goto exit;
1098
0
        }
1099
337k
        switch (*in++) {
1100
315k
        case '"': case '\\': case '/':
1101
315k
            ds_put_char(&out, in[-1]);
1102
315k
            break;
1103
1104
874
        case 'b':
1105
874
            ds_put_char(&out, '\b');
1106
874
            break;
1107
1108
14.4k
        case 'f':
1109
14.4k
            ds_put_char(&out, '\f');
1110
14.4k
            break;
1111
1112
961
        case 'n':
1113
961
            ds_put_char(&out, '\n');
1114
961
            break;
1115
1116
2.03k
        case 'r':
1117
2.03k
            ds_put_char(&out, '\r');
1118
2.03k
            break;
1119
1120
765
        case 't':
1121
765
            ds_put_char(&out, '\t');
1122
765
            break;
1123
1124
2.88k
        case 'u':
1125
2.88k
            in = json_lex_unicode(in, end, &out);
1126
2.88k
            if (!in) {
1127
97
                goto exit;
1128
97
            }
1129
2.78k
            break;
1130
1131
2.78k
        default:
1132
17
            ds_clear(&out);
1133
17
            ds_put_format(&out, "bad escape \\%c", in[-1]);
1134
17
            goto exit;
1135
337k
        }
1136
337k
    }
1137
15.3k
    ok = true;
1138
1139
15.4k
exit:
1140
15.4k
    *outp = ds_cstr(&out);
1141
15.4k
    return ok;
1142
15.3k
}
1143
1144
void
1145
json_string_escape(const char *in, struct ds *out)
1146
0
{
1147
0
    struct json json = {
1148
0
        .type = JSON_STRING,
1149
0
        .storage_type = JSON_STRING_DYNAMIC,
1150
0
        .str_ptr = CONST_CAST(char *, in),
1151
0
    };
1152
0
    json_to_ds(&json, 0, out);
1153
0
}
1154
1155
static void
1156
json_parser_input_string(struct json_parser *p, const char *s)
1157
50.9k
{
1158
50.9k
    struct json_token token;
1159
1160
50.9k
    token.type = T_STRING;
1161
50.9k
    token.string = s;
1162
50.9k
    json_parser_input(p, &token);
1163
50.9k
}
1164
1165
static void
1166
json_lex_string(struct json_parser *p)
1167
51.0k
{
1168
51.0k
    const char *raw = ds_cstr(&p->buffer);
1169
51.0k
    if (!strchr(raw, '\\')) {
1170
35.5k
        json_parser_input_string(p, raw);
1171
35.5k
    } else {
1172
15.4k
        char *cooked;
1173
1174
15.4k
        if (json_string_unescape(raw, strlen(raw), &cooked)) {
1175
15.3k
            json_parser_input_string(p, cooked);
1176
15.3k
        } else {
1177
114
            json_error(p, "%s", cooked);
1178
114
        }
1179
1180
15.4k
        free(cooked);
1181
15.4k
    }
1182
51.0k
}
1183
1184

1185
/* Parsing. */
1186
1187
/* Parses 'string' as a JSON object or array and returns a newly allocated
1188
 * 'struct json'.  The caller must free the returned structure with
1189
 * json_destroy() when it is no longer needed.
1190
 *
1191
 * 'string' must be encoded in UTF-8.
1192
 *
1193
 * If 'string' is valid JSON, then the returned 'struct json' will be either an
1194
 * object (JSON_OBJECT) or an array (JSON_ARRAY).
1195
 *
1196
 * If 'string' is not valid JSON, then the returned 'struct json' will be a
1197
 * string (JSON_STRING) that describes the particular error encountered during
1198
 * parsing.  (This is an acceptable means of error reporting because at its top
1199
 * level JSON must be either an object or an array; a bare string is not
1200
 * valid.) */
1201
struct json *
1202
json_from_string(const char *string)
1203
4.01k
{
1204
4.01k
    struct json_parser *p = json_parser_create(JSPF_TRAILER);
1205
4.01k
    json_parser_feed(p, string, strlen(string));
1206
4.01k
    return json_parser_finish(p);
1207
4.01k
}
1208
1209
/* Parses data of JSON_SERIALIZED_OBJECT to the real JSON. */
1210
struct json *
1211
json_from_serialized_object(const struct json *json)
1212
0
{
1213
0
    return json_from_string(json_serialized_object(json));
1214
0
}
1215
1216
/* Reads the file named 'file_name', parses its contents as a JSON object or
1217
 * array, and returns a newly allocated 'struct json'.  The caller must free
1218
 * the returned structure with json_destroy() when it is no longer needed.
1219
 *
1220
 * The file must be encoded in UTF-8.
1221
 *
1222
 * See json_from_string() for return value semantics.
1223
 */
1224
struct json *
1225
json_from_file(const char *file_name)
1226
0
{
1227
0
    struct json *json;
1228
0
    FILE *stream;
1229
1230
0
    stream = fopen(file_name, "r");
1231
0
    if (!stream) {
1232
0
        return json_string_create_nocopy(
1233
0
            xasprintf("error opening \"%s\": %s", file_name,
1234
0
                      ovs_strerror(errno)));
1235
0
    }
1236
0
    json = json_from_stream(stream);
1237
0
    fclose(stream);
1238
1239
0
    return json;
1240
0
}
1241
1242
/* Parses the contents of 'stream' as a JSON object or array, and returns a
1243
 * newly allocated 'struct json'.  The caller must free the returned structure
1244
 * with json_destroy() when it is no longer needed.
1245
 *
1246
 * The file must be encoded in UTF-8.
1247
 *
1248
 * See json_from_string() for return value semantics.
1249
 */
1250
struct json *
1251
json_from_stream(FILE *stream)
1252
0
{
1253
0
    struct json_parser *p;
1254
0
    struct json *json;
1255
1256
0
    p = json_parser_create(JSPF_TRAILER);
1257
0
    for (;;) {
1258
0
        char buffer[BUFSIZ];
1259
0
        size_t n;
1260
1261
0
        n = fread(buffer, 1, sizeof buffer, stream);
1262
0
        if (!n || json_parser_feed(p, buffer, n) != n) {
1263
0
            break;
1264
0
        }
1265
0
    }
1266
0
    json = json_parser_finish(p);
1267
1268
0
    if (ferror(stream)) {
1269
0
        json_destroy(json);
1270
0
        json = json_string_create_nocopy(
1271
0
            xasprintf("error reading JSON stream: %s", ovs_strerror(errno)));
1272
0
    }
1273
1274
0
    return json;
1275
0
}
1276
1277
struct json_parser *
1278
json_parser_create(int flags)
1279
4.01k
{
1280
4.01k
    struct json_parser *p = xzalloc(sizeof *p);
1281
4.01k
    p->flags = flags;
1282
4.01k
    return p;
1283
4.01k
}
1284
1285
static inline void ALWAYS_INLINE
1286
json_parser_account_byte(struct json_parser *p, unsigned char c)
1287
70.0M
{
1288
70.0M
    p->byte_number++;
1289
70.0M
    if (OVS_UNLIKELY(c == '\n')) {
1290
217
        p->column_number = 0;
1291
217
        p->line_number++;
1292
70.0M
    } else {
1293
70.0M
        p->column_number++;
1294
70.0M
    }
1295
70.0M
}
1296
1297
size_t
1298
json_parser_feed(struct json_parser *p, const char *input, size_t n)
1299
5.43k
{
1300
5.43k
    size_t token_start = 0;
1301
5.43k
    size_t i;
1302
1303
86.9M
    for (i = 0; !p->done && i < n; ) {
1304
86.9M
        bool consumed = true;
1305
1306
86.9M
        const char *start_p = &input[token_start];
1307
86.9M
        unsigned char c = input[i];
1308
86.9M
        struct json_token token;
1309
1310
86.9M
        switch (p->lex_state) {
1311
37.3M
        case JSON_LEX_START:
1312
37.3M
            switch (c) {
1313
1.59k
            case ' ': case '\t': case '\n': case '\r':
1314
                /* Nothing to do. */
1315
1.59k
                token_start = i + 1;
1316
1.59k
                break;
1317
1318
6
            case 'a': case 'b': case 'c': case 'd': case 'e':
1319
1.50k
            case 'f': case 'g': case 'h': case 'i': case 'j':
1320
73.3k
            case 'k': case 'l': case 'm': case 'n': case 'o':
1321
75.8k
            case 'p': case 'q': case 'r': case 's': case 't':
1322
75.8k
            case 'u': case 'v': case 'w': case 'x': case 'y':
1323
75.8k
            case 'z':
1324
75.8k
                p->lex_state = JSON_LEX_KEYWORD;
1325
75.8k
                token_start = i;
1326
75.8k
                break;
1327
1328
20.3M
            case '[': case '{': case ']': case '}': case ':': case ',':
1329
20.3M
                token.type = c;
1330
20.3M
                json_parser_input(p, &token);
1331
20.3M
                token_start = i + 1;
1332
20.3M
                break;
1333
1334
28.7k
            case '-':
1335
15.6M
            case '0': case '1': case '2': case '3': case '4':
1336
16.8M
            case '5': case '6': case '7': case '8': case '9':
1337
16.8M
                p->lex_state = JSON_LEX_NUMBER;
1338
16.8M
                token_start = i;
1339
16.8M
                break;
1340
1341
51.0k
            case '"':
1342
51.0k
                p->lex_state = JSON_LEX_STRING;
1343
51.0k
                token_start = i + 1;
1344
51.0k
                break;
1345
1346
12
            default:
1347
12
                if (isprint(c)) {
1348
6
                    json_error(p, "invalid character '%c'", c);
1349
6
                } else {
1350
6
                    json_error(p, "invalid character U+%04x", c);
1351
6
                }
1352
12
                break;
1353
37.3M
            }
1354
37.3M
            break;
1355
1356
37.3M
        case JSON_LEX_KEYWORD:
1357
305k
            if (!isalpha((unsigned char) c)) {
1358
75.8k
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1359
75.8k
                json_lex_keyword(p);
1360
75.8k
                consumed = false;
1361
75.8k
                break;
1362
75.8k
            }
1363
229k
            break;
1364
1365
20.5M
        case JSON_LEX_NUMBER:
1366
20.5M
            if (!strchr(".0123456789eE-+", c)) {
1367
16.8M
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1368
16.8M
                json_lex_number(p);
1369
16.8M
                consumed = false;
1370
16.8M
                break;
1371
16.8M
            }
1372
3.74M
            break;
1373
1374
28.3M
        case JSON_LEX_STRING:
1375
28.3M
            if (c == '\\') {
1376
342k
                p->lex_state = JSON_LEX_ESCAPE;
1377
28.0M
            } else if (c == '"') {
1378
51.0k
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1379
51.0k
                json_lex_string(p);
1380
27.9M
            } else if (c < 0x20) {
1381
9
                json_error(p, "U+%04X must be escaped in quoted string", c);
1382
9
            }
1383
28.3M
            break;
1384
1385
342k
        case JSON_LEX_ESCAPE:
1386
342k
            p->lex_state = JSON_LEX_STRING;
1387
342k
            break;
1388
1389
0
        default:
1390
0
            ovs_abort(0, "unexpected lexer state");
1391
86.9M
        }
1392
1393
86.9M
        if (consumed) {
1394
70.0M
            json_parser_account_byte(p, c);
1395
70.0M
            i++;
1396
70.0M
        }
1397
86.9M
    }
1398
1399
5.43k
    if (!p->done) {
1400
3.79k
        ds_put_buffer(&p->buffer, &input[token_start], i - token_start);
1401
3.79k
    }
1402
5.43k
    return i;
1403
5.43k
}
1404
1405
bool
1406
json_parser_is_done(const struct json_parser *p)
1407
0
{
1408
0
    return p->done;
1409
0
}
1410
1411
struct json *
1412
json_parser_finish(struct json_parser *p)
1413
4.01k
{
1414
4.01k
    struct json *json;
1415
1416
4.01k
    switch (p->lex_state) {
1417
2.43k
    case JSON_LEX_START:
1418
2.43k
        break;
1419
1420
159
    case JSON_LEX_STRING:
1421
167
    case JSON_LEX_ESCAPE:
1422
167
        json_error(p, "unexpected end of input in quoted string");
1423
167
        break;
1424
1425
1.24k
    case JSON_LEX_NUMBER:
1426
1.41k
    case JSON_LEX_KEYWORD:
1427
1.41k
        json_parser_feed(p, " ", 1);
1428
1.41k
        break;
1429
4.01k
    }
1430
1431
4.01k
    if (p->parse_state == JSON_PARSE_START) {
1432
1.49k
        json_error(p, "empty input stream");
1433
2.51k
    } else if (p->parse_state != JSON_PARSE_END) {
1434
1.00k
        json_error(p, "unexpected end of input");
1435
1.00k
    }
1436
1437
4.01k
    if (!p->error) {
1438
1.48k
        ovs_assert(p->height == 1);
1439
1.48k
        ovs_assert(p->stack[0].json != NULL);
1440
1.48k
        json = p->stack[--p->height].json;
1441
2.52k
    } else {
1442
2.52k
        json = json_string_create_nocopy(p->error);
1443
2.52k
        p->error = NULL;
1444
2.52k
    }
1445
1446
4.01k
    json_parser_abort(p);
1447
1448
4.01k
    return json;
1449
4.01k
}
1450
1451
void
1452
json_parser_abort(struct json_parser *p)
1453
4.01k
{
1454
4.01k
    if (p) {
1455
4.01k
        ds_destroy(&p->buffer);
1456
4.01k
        if (p->height) {
1457
1.02k
            json_destroy(p->stack[0].json);
1458
1.02k
        }
1459
4.01k
        free(p->stack);
1460
4.01k
        free(p->member_name);
1461
4.01k
        free(p->error);
1462
4.01k
        free(p);
1463
4.01k
    }
1464
4.01k
}
1465
1466
static struct json_parser_node *
1467
json_parser_top(struct json_parser *p)
1468
20.6M
{
1469
20.6M
    return &p->stack[p->height - 1];
1470
20.6M
}
1471
1472
static void
1473
json_parser_put_value(struct json_parser *p, struct json *value)
1474
18.1M
{
1475
18.1M
    struct json_parser_node *node = json_parser_top(p);
1476
18.1M
    if (node->json->type == JSON_OBJECT) {
1477
32.0k
        json_object_put_nocopy(node->json, p->member_name, value);
1478
32.0k
        p->member_name = NULL;
1479
18.1M
    } else if (node->json->type == JSON_ARRAY) {
1480
18.1M
        json_array_add(node->json, value);
1481
18.1M
    } else {
1482
0
        OVS_NOT_REACHED();
1483
0
    }
1484
18.1M
}
1485
1486
static void
1487
json_parser_push(struct json_parser *p,
1488
                 struct json *new_json, enum json_parse_state new_state)
1489
1.24M
{
1490
1.24M
    if (p->height < JSON_MAX_HEIGHT) {
1491
1.24M
        struct json_parser_node *node;
1492
1493
1.24M
        if (p->height >= p->allocated_height) {
1494
9.26k
            p->stack = x2nrealloc(p->stack, &p->allocated_height,
1495
9.26k
                                  sizeof *p->stack);
1496
9.26k
        }
1497
1498
1.24M
        if (p->height > 0) {
1499
1.24M
            json_parser_put_value(p, new_json);
1500
1.24M
        }
1501
1502
1.24M
        node = &p->stack[p->height++];
1503
1.24M
        node->json = new_json;
1504
1.24M
        p->parse_state = new_state;
1505
1.24M
    } else {
1506
2
        json_destroy(new_json);
1507
2
        json_error(p, "input exceeds maximum nesting depth %d",
1508
2
                   JSON_MAX_HEIGHT);
1509
2
    }
1510
1.24M
}
1511
1512
static void
1513
json_parser_push_object(struct json_parser *p)
1514
826k
{
1515
826k
    json_parser_push(p, json_object_create(), JSON_PARSE_OBJECT_INIT);
1516
826k
}
1517
1518
static void
1519
json_parser_push_array(struct json_parser *p)
1520
422k
{
1521
422k
    json_parser_push(p, json_array_create_empty(), JSON_PARSE_ARRAY_INIT);
1522
422k
}
1523
1524
static void
1525
json_parse_value(struct json_parser *p, struct json_token *token,
1526
                 enum json_parse_state next_state)
1527
18.1M
{
1528
18.1M
    struct json *value;
1529
1530
18.1M
    switch (token->type) {
1531
1.45k
    case T_FALSE:
1532
1.45k
        value = json_boolean_create(false);
1533
1.45k
        break;
1534
1535
71.8k
    case T_NULL:
1536
71.8k
        value = json_null_create();
1537
71.8k
        break;
1538
1539
2.44k
    case T_TRUE:
1540
2.44k
        value = json_boolean_create(true);
1541
2.44k
        break;
1542
1543
824k
    case '{':
1544
824k
        json_parser_push_object(p);
1545
824k
        return;
1546
1547
420k
    case '[':
1548
420k
        json_parser_push_array(p);
1549
420k
        return;
1550
1551
16.7M
    case T_INTEGER:
1552
16.7M
        value = json_integer_create(token->integer);
1553
16.7M
        break;
1554
1555
63.3k
    case T_REAL:
1556
63.3k
        value = json_real_create(token->real);
1557
63.3k
        break;
1558
1559
18.3k
    case T_STRING:
1560
18.3k
        value = json_string_create(token->string);
1561
18.3k
        break;
1562
1563
0
    case T_EOF:
1564
1
    case '}':
1565
2
    case ']':
1566
10
    case ':':
1567
17
    case ',':
1568
17
    default:
1569
17
        json_error(p, "syntax error expecting value");
1570
17
        return;
1571
18.1M
    }
1572
1573
16.9M
    json_parser_put_value(p, value);
1574
16.9M
    p->parse_state = next_state;
1575
16.9M
}
1576
1577
static void
1578
json_parser_pop(struct json_parser *p)
1579
1.21M
{
1580
1.21M
    struct json_parser_node *node;
1581
1582
    /* Conserve memory. */
1583
1.21M
    node = json_parser_top(p);
1584
1.21M
    if (node->json->type == JSON_ARRAY) {
1585
394k
        json_array_trim(node->json);
1586
394k
    }
1587
1588
    /* Pop off the top-of-stack. */
1589
1.21M
    if (p->height == 1) {
1590
1.51k
        p->parse_state = JSON_PARSE_END;
1591
1.51k
        if (!(p->flags & JSPF_TRAILER)) {
1592
0
            p->done = true;
1593
0
        }
1594
1.21M
    } else {
1595
1.21M
        p->height--;
1596
1.21M
        node = json_parser_top(p);
1597
1.21M
        if (node->json->type == JSON_ARRAY) {
1598
1.21M
            p->parse_state = JSON_PARSE_ARRAY_NEXT;
1599
1.21M
        } else if (node->json->type == JSON_OBJECT) {
1600
4.93k
            p->parse_state = JSON_PARSE_OBJECT_NEXT;
1601
4.93k
        } else {
1602
0
            OVS_NOT_REACHED();
1603
0
        }
1604
1.21M
    }
1605
1.21M
}
1606
1607
static void
1608
json_parser_input(struct json_parser *p, struct json_token *token)
1609
37.3M
{
1610
37.3M
    switch (p->parse_state) {
1611
3.62k
    case JSON_PARSE_START:
1612
3.62k
        if (token->type == '{') {
1613
1.18k
            json_parser_push_object(p);
1614
2.43k
        } else if (token->type == '[') {
1615
1.33k
            json_parser_push_array(p);
1616
1.33k
        } else {
1617
1.10k
            json_error(p, "syntax error at beginning of input");
1618
1.10k
        }
1619
3.62k
        break;
1620
1621
18
    case JSON_PARSE_END:
1622
18
        json_error(p, "trailing garbage at end of input");
1623
18
        break;
1624
1625
825k
    case JSON_PARSE_OBJECT_INIT:
1626
825k
        if (token->type == '}') {
1627
816k
            json_parser_pop(p);
1628
816k
            break;
1629
816k
        }
1630
        /* Fall through. */
1631
32.1k
    case JSON_PARSE_OBJECT_NAME:
1632
32.1k
        if (token->type == T_STRING) {
1633
32.1k
            p->member_name = xstrdup(token->string);
1634
32.1k
            p->parse_state = JSON_PARSE_OBJECT_COLON;
1635
32.1k
        } else {
1636
30
            json_error(p, "syntax error parsing object expecting string");
1637
30
        }
1638
32.1k
        break;
1639
1640
32.1k
    case JSON_PARSE_OBJECT_COLON:
1641
32.1k
        if (token->type == ':') {
1642
32.0k
            p->parse_state = JSON_PARSE_OBJECT_VALUE;
1643
32.0k
        } else {
1644
13
            json_error(p, "syntax error parsing object expecting ':'");
1645
13
        }
1646
32.1k
        break;
1647
1648
32.0k
    case JSON_PARSE_OBJECT_VALUE:
1649
32.0k
        json_parse_value(p, token, JSON_PARSE_OBJECT_NEXT);
1650
32.0k
        break;
1651
1652
28.5k
    case JSON_PARSE_OBJECT_NEXT:
1653
28.5k
        if (token->type == ',') {
1654
22.4k
            p->parse_state = JSON_PARSE_OBJECT_NAME;
1655
22.4k
        } else if (token->type == '}') {
1656
6.09k
            json_parser_pop(p);
1657
6.09k
        } else {
1658
11
            json_error(p, "syntax error expecting '}' or ','");
1659
11
        }
1660
28.5k
        break;
1661
1662
421k
    case JSON_PARSE_ARRAY_INIT:
1663
421k
        if (token->type == ']') {
1664
109k
            json_parser_pop(p);
1665
109k
            break;
1666
109k
        }
1667
        /* Fall through. */
1668
18.1M
    case JSON_PARSE_ARRAY_VALUE:
1669
18.1M
        json_parse_value(p, token, JSON_PARSE_ARRAY_NEXT);
1670
18.1M
        break;
1671
1672
18.1M
    case JSON_PARSE_ARRAY_NEXT:
1673
18.1M
        if (token->type == ',') {
1674
17.8M
            p->parse_state = JSON_PARSE_ARRAY_VALUE;
1675
17.8M
        } else if (token->type == ']') {
1676
284k
            json_parser_pop(p);
1677
284k
        } else {
1678
32
            json_error(p, "syntax error expecting ']' or ','");
1679
32
        }
1680
18.1M
        break;
1681
1682
0
    default:
1683
0
        abort();
1684
37.3M
    }
1685
1686
37.3M
    p->lex_state = JSON_LEX_START;
1687
37.3M
    ds_clear(&p->buffer);
1688
37.3M
}
1689
1690
static struct json *
1691
json_create(enum json_type type)
1692
18.1M
{
1693
18.1M
    struct json *json = xmalloc(sizeof *json);
1694
18.1M
    json->type = type;
1695
18.1M
    json->count = 1;
1696
18.1M
    return json;
1697
18.1M
}
1698
1699
static void
1700
json_error(struct json_parser *p, const char *format, ...)
1701
4.30k
{
1702
4.30k
    if (!p->error) {
1703
2.52k
        struct ds msg;
1704
2.52k
        va_list args;
1705
1706
2.52k
        ds_init(&msg);
1707
2.52k
        ds_put_format(&msg, "line %d, column %d, byte %d: ",
1708
2.52k
                      p->line_number, p->column_number, p->byte_number);
1709
2.52k
        va_start(args, format);
1710
2.52k
        ds_put_format_valist(&msg, format, args);
1711
2.52k
        va_end(args);
1712
1713
2.52k
        p->error = ds_steal_cstr(&msg);
1714
1715
2.52k
        p->done = true;
1716
2.52k
    }
1717
4.30k
}
1718

1719
19.5M
#define SPACES_PER_LEVEL 2
1720
1721
struct json_serializer {
1722
    struct ds *ds;
1723
    int depth;
1724
    int flags;
1725
};
1726
1727
static void json_serialize(const struct json *, struct json_serializer *);
1728
static void json_serialize_object(const struct shash *object,
1729
                                  struct json_serializer *);
1730
static void json_serialize_array(const struct json *,
1731
                                 struct json_serializer *);
1732
static void json_serialize_string(const char *, struct ds *);
1733
1734
/* Converts 'json' to a string in JSON format, encoded in UTF-8, and returns
1735
 * that string.  The caller is responsible for freeing the returned string,
1736
 * with free(), when it is no longer needed.
1737
 *
1738
 * If 'flags' contains JSSF_PRETTY, the output is pretty-printed with each
1739
 * nesting level introducing an additional indentation.  Otherwise, the
1740
 * returned string does not contain any new-line characters.
1741
 *
1742
 * If 'flags' contains JSSF_SORT, members of objects in the output are sorted
1743
 * in bytewise lexicographic order for reproducibility.  Otherwise, members of
1744
 * objects are output in an indeterminate order.
1745
 *
1746
 * The returned string is valid JSON only if 'json' represents an array or an
1747
 * object, since a bare literal does not satisfy the JSON grammar. */
1748
char *
1749
json_to_string(const struct json *json, int flags)
1750
1.72k
{
1751
1.72k
    struct ds ds;
1752
1753
1.72k
    ds_init(&ds);
1754
1.72k
    json_to_ds(json, flags, &ds);
1755
1.72k
    return ds_steal_cstr(&ds);
1756
1.72k
}
1757
1758
/* Same as json_to_string(), but the output is appended to 'ds'. */
1759
void
1760
json_to_ds(const struct json *json, int flags, struct ds *ds)
1761
1.72k
{
1762
1.72k
    struct json_serializer s;
1763
1764
1.72k
    s.ds = ds;
1765
1.72k
    s.depth = 0;
1766
1.72k
    s.flags = flags;
1767
1.72k
    json_serialize(json, &s);
1768
1.72k
}
1769
1770
static void
1771
json_serialize(const struct json *json, struct json_serializer *s)
1772
18.7M
{
1773
18.7M
    struct ds *ds = s->ds;
1774
1775
18.7M
    switch (json->type) {
1776
71.8k
    case JSON_NULL:
1777
71.8k
        ds_put_cstr(ds, "null");
1778
71.8k
        break;
1779
1780
1.20k
    case JSON_FALSE:
1781
1.20k
        ds_put_cstr(ds, "false");
1782
1.20k
        break;
1783
1784
2.23k
    case JSON_TRUE:
1785
2.23k
        ds_put_cstr(ds, "true");
1786
2.23k
        break;
1787
1788
826k
    case JSON_OBJECT:
1789
826k
        json_serialize_object(json->object, s);
1790
826k
        break;
1791
1792
499k
    case JSON_ARRAY:
1793
499k
        json_serialize_array(json, s);
1794
499k
        break;
1795
1796
17.2M
    case JSON_INTEGER:
1797
17.2M
        ds_put_format(ds, "%lld", json->integer);
1798
17.2M
        break;
1799
1800
65.0k
    case JSON_REAL:
1801
65.0k
        ds_put_format(ds, "%.*g", DBL_DIG, json->real);
1802
65.0k
        break;
1803
1804
17.0k
    case JSON_STRING:
1805
17.0k
        json_serialize_string(json_string(json), ds);
1806
17.0k
        break;
1807
1808
0
    case JSON_SERIALIZED_OBJECT:
1809
0
        ds_put_cstr(ds, json_serialized_object(json));
1810
0
        break;
1811
1812
0
    case JSON_N_TYPES:
1813
0
    default:
1814
0
        OVS_NOT_REACHED();
1815
18.7M
    }
1816
18.7M
}
1817
1818
static void
1819
indent_line(struct json_serializer *s)
1820
19.5M
{
1821
19.5M
    if (s->flags & JSSF_PRETTY) {
1822
19.5M
        ds_put_char(s->ds, '\n');
1823
19.5M
        ds_put_char_multiple(s->ds, ' ', SPACES_PER_LEVEL * s->depth);
1824
19.5M
    }
1825
19.5M
}
1826
1827
static void
1828
json_serialize_object_member(size_t i, const struct shash_node *node,
1829
                             struct json_serializer *s)
1830
23.4k
{
1831
23.4k
    struct ds *ds = s->ds;
1832
1833
23.4k
    if (i) {
1834
15.2k
        ds_put_char(ds, ',');
1835
15.2k
        indent_line(s);
1836
15.2k
    }
1837
1838
23.4k
    json_serialize_string(node->name, ds);
1839
23.4k
    ds_put_char(ds, ':');
1840
23.4k
    if (s->flags & JSSF_PRETTY) {
1841
23.4k
        ds_put_char(ds, ' ');
1842
23.4k
    }
1843
23.4k
    json_serialize(node->data, s);
1844
23.4k
}
1845
1846
static void
1847
json_serialize_object(const struct shash *object, struct json_serializer *s)
1848
826k
{
1849
826k
    struct ds *ds = s->ds;
1850
1851
826k
    ds_put_char(ds, '{');
1852
1853
826k
    s->depth++;
1854
826k
    indent_line(s);
1855
1856
826k
    if (s->flags & JSSF_YIELD) {
1857
0
        cooperative_multitasking_yield();
1858
0
    }
1859
1860
826k
    if (s->flags & JSSF_SORT) {
1861
826k
        const struct shash_node **nodes;
1862
826k
        size_t n, i;
1863
1864
826k
        nodes = shash_sort(object);
1865
826k
        n = shash_count(object);
1866
849k
        for (i = 0; i < n; i++) {
1867
23.4k
            json_serialize_object_member(i, nodes[i], s);
1868
23.4k
        }
1869
826k
        free(nodes);
1870
826k
    } else {
1871
0
        struct shash_node *node;
1872
0
        size_t i;
1873
1874
0
        i = 0;
1875
0
        SHASH_FOR_EACH (node, object) {
1876
0
            json_serialize_object_member(i++, node, s);
1877
0
        }
1878
0
    }
1879
1880
826k
    ds_put_char(ds, '}');
1881
826k
    s->depth--;
1882
826k
}
1883
1884
static void
1885
json_serialize_array(const struct json *json, struct json_serializer *s)
1886
499k
{
1887
499k
    size_t i, n = json_array_size(json);
1888
499k
    struct ds *ds = s->ds;
1889
1890
499k
    ds_put_char(ds, '[');
1891
499k
    s->depth++;
1892
1893
499k
    if (s->flags & JSSF_YIELD) {
1894
0
        cooperative_multitasking_yield();
1895
0
    }
1896
1897
499k
    if (n > 0) {
1898
292k
        indent_line(s);
1899
1900
18.9M
        for (i = 0; i < n; i++) {
1901
18.6M
            if (i) {
1902
18.3M
                ds_put_char(ds, ',');
1903
18.3M
                indent_line(s);
1904
18.3M
            }
1905
18.6M
            json_serialize(json_array_at(json, i), s);
1906
18.6M
        }
1907
292k
    }
1908
1909
499k
    s->depth--;
1910
499k
    ds_put_char(ds, ']');
1911
499k
}
1912
1913
static const char *chars_escaping[256] = {
1914
        "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", "\\u0007",
1915
        "\\b", "\\t", "\\n", "\\u000b", "\\f", "\\r", "\\u000e", "\\u000f",
1916
        "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", "\\u0015", "\\u0016", "\\u0017",
1917
        "\\u0018", "\\u0019", "\\u001a", "\\u001b", "\\u001c", "\\u001d", "\\u001e", "\\u001f",
1918
        " ", "!", "\\\"", "#", "$", "%", "&", "'",
1919
        "(", ")", "*", "+", ",", "-", ".", "/",
1920
        "0", "1", "2", "3", "4", "5", "6", "7",
1921
        "8", "9", ":", ";", "<", "=", ">", "?",
1922
        "@", "A", "B", "C", "D", "E", "F", "G",
1923
        "H", "I", "J", "K", "L", "M", "N", "O",
1924
        "P", "Q", "R", "S", "T", "U", "V", "W",
1925
        "X", "Y", "Z", "[", "\\\\", "]", "^", "_",
1926
        "`", "a", "b", "c", "d", "e", "f", "g",
1927
        "h", "i", "j", "k", "l", "m", "n", "o",
1928
        "p", "q", "r", "s", "t", "u", "v", "w",
1929
        "x", "y", "z", "{", "|", "}", "~", "\x7f",
1930
        "\x80", "\x81", "\x82", "\x83", "\x84", "\x85", "\x86", "\x87",
1931
        "\x88", "\x89", "\x8a", "\x8b", "\x8c", "\x8d", "\x8e", "\x8f",
1932
        "\x90", "\x91", "\x92", "\x93", "\x94", "\x95", "\x96", "\x97",
1933
        "\x98", "\x99", "\x9a", "\x9b", "\x9c", "\x9d", "\x9e", "\x9f",
1934
        "\xa0", "\xa1", "\xa2", "\xa3", "\xa4", "\xa5", "\xa6", "\xa7",
1935
        "\xa8", "\xa9", "\xaa", "\xab", "\xac", "\xad", "\xae", "\xaf",
1936
        "\xb0", "\xb1", "\xb2", "\xb3", "\xb4", "\xb5", "\xb6", "\xb7",
1937
        "\xb8", "\xb9", "\xba", "\xbb", "\xbc", "\xbd", "\xbe", "\xbf",
1938
        "\xc0", "\xc1", "\xc2", "\xc3", "\xc4", "\xc5", "\xc6", "\xc7",
1939
        "\xc8", "\xc9", "\xca", "\xcb", "\xcc", "\xcd", "\xce", "\xcf",
1940
        "\xd0", "\xd1", "\xd2", "\xd3", "\xd4", "\xd5", "\xd6", "\xd7",
1941
        "\xd8", "\xd9", "\xda", "\xdb", "\xdc", "\xdd", "\xde", "\xdf",
1942
        "\xe0", "\xe1", "\xe2", "\xe3", "\xe4", "\xe5", "\xe6", "\xe7",
1943
        "\xe8", "\xe9", "\xea", "\xeb", "\xec", "\xed", "\xee", "\xef",
1944
        "\xf0", "\xf1", "\xf2", "\xf3", "\xf4", "\xf5", "\xf6", "\xf7",
1945
        "\xf8", "\xf9", "\xfa", "\xfb", "\xfc", "\xfd", "\xfe", "\xff"
1946
};
1947
1948
static void
1949
json_serialize_string(const char *string, struct ds *ds)
1950
40.5k
{
1951
40.5k
    uint8_t c;
1952
40.5k
    uint8_t c2;
1953
40.5k
    size_t count;
1954
40.5k
    const char *escape;
1955
40.5k
    const char *start;
1956
1957
40.5k
    ds_put_char(ds, '"');
1958
40.5k
    count = 0;
1959
40.5k
    start = string;
1960
13.5M
    while ((c = *string++) != '\0') {
1961
13.5M
        if (c >= ' ' && c != '"' && c != '\\') {
1962
12.9M
            count++;
1963
12.9M
        } else {
1964
642k
            if (count) {
1965
3.20k
                ds_put_buffer(ds, start, count);
1966
3.20k
                count = 0;
1967
3.20k
            }
1968
642k
            start = string;
1969
642k
            escape = chars_escaping[c];
1970
1.92M
            while ((c2 = *escape++) != '\0') {
1971
1.28M
                ds_put_char(ds, c2);
1972
1.28M
            }
1973
642k
        }
1974
13.5M
    }
1975
40.5k
    if (count) {
1976
34.6k
        ds_put_buffer(ds, start, count);
1977
34.6k
    }
1978
40.5k
    ds_put_char(ds, '"');
1979
40.5k
}