Coverage Report

Created: 2026-10-28 06:16

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.68M
#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
41.3k
{
169
41.3k
    return json_create(JSON_NULL);
170
41.3k
}
171
172
struct json *
173
json_boolean_create(bool b)
174
3.14k
{
175
3.14k
    return json_create(b ? JSON_TRUE : JSON_FALSE);
176
3.14k
}
177
178
struct json *
179
json_string_create_nocopy(char *s)
180
2.58k
{
181
2.58k
    struct json *json = json_create(JSON_STRING);
182
2.58k
    json->storage_type = JSON_STRING_DYNAMIC;
183
2.58k
    json->str_ptr = s;
184
2.58k
    return json;
185
2.58k
}
186
187
struct json *
188
json_string_create(const char *s)
189
20.1k
{
190
20.1k
    struct json *json = json_create(JSON_STRING);
191
20.1k
    size_t length = strlen(s);
192
193
20.1k
    if (length <= JSON_STRING_INLINE_LEN) {
194
19.1k
        json->storage_type = JSON_STRING_INLINE;
195
19.1k
        memcpy(json->str, s, length);
196
19.1k
        json->str[length] = '\0';
197
19.1k
    } else {
198
978
        json->storage_type = JSON_STRING_DYNAMIC;
199
978
        json->str_ptr = xmemdup0(s, length);
200
978
    }
201
20.1k
    return json;
202
20.1k
}
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
439k
{
228
439k
    struct json *json = json_create(JSON_ARRAY);
229
439k
    json->storage_type = JSON_ARRAY_DYNAMIC;
230
439k
    json->array.elements = NULL;
231
439k
    json->array.size = 0;
232
439k
    json->array.allocated = 0;
233
439k
    return json;
234
439k
}
235
236
void
237
json_array_add(struct json *array_, struct json *element)
238
19.6M
{
239
19.6M
    switch (array_->storage_type) {
240
19.5M
    case JSON_ARRAY_DYNAMIC:
241
19.5M
        if (!array_->array.size) {
242
328k
            array_->storage_type = JSON_ARRAY_INLINE_1;
243
328k
            array_->elements[0] = element;
244
328k
            return;
245
328k
        }
246
19.2M
        break;
247
248
19.2M
    case JSON_ARRAY_INLINE_1:
249
37.6k
    case JSON_ARRAY_INLINE_2:
250
37.6k
        array_->elements[array_->storage_type - JSON_ARRAY_DYNAMIC] = element;
251
37.6k
        array_->storage_type++;
252
37.6k
        return;
253
254
7.45k
    case JSON_ARRAY_INLINE_3: {
255
7.45k
        struct json **elements = xmalloc(4 * sizeof *elements);
256
257
7.45k
        memcpy(elements, array_->elements, 3 * sizeof array_->elements[0]);
258
7.45k
        array_->array.elements = elements;
259
7.45k
        array_->array.elements[3] = element;
260
7.45k
        array_->array.size = 4;
261
7.45k
        array_->array.allocated = 4;
262
7.45k
        array_->storage_type = JSON_ARRAY_DYNAMIC;
263
7.45k
        return;
264
27.2k
    }
265
266
0
    case JSON_STRING_DYNAMIC:
267
0
    case JSON_STRING_INLINE:
268
0
    default:
269
0
        OVS_NOT_REACHED();
270
19.6M
    }
271
272
19.2M
    struct json_array *array = &array_->array;
273
19.2M
    if (array->size >= array->allocated) {
274
19.3k
        array->elements = x2nrealloc(array->elements, &array->allocated,
275
19.3k
                                     sizeof *array->elements);
276
19.3k
    }
277
19.2M
    array->elements[array->size++] = element;
278
19.2M
}
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
410k
{
317
410k
    if (array_->storage_type != JSON_ARRAY_DYNAMIC) {
318
293k
        return;
319
293k
    }
320
321
117k
    struct json_array *array = &array_->array;
322
117k
    if (array->size < array->allocated) {
323
5.36k
        array->allocated = array->size;
324
5.36k
        array->elements = xrealloc(array->elements,
325
5.36k
                                   array->size * sizeof *array->elements);
326
5.36k
    }
327
117k
}
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.24M
{
394
1.24M
    struct json *json = json_create(JSON_OBJECT);
395
1.24M
    json->object = xmalloc(sizeof *json->object);
396
1.24M
    shash_init(json->object);
397
1.24M
    return json;
398
1.24M
}
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
17.8M
{
410
17.8M
    struct json *json = json_create(JSON_INTEGER);
411
17.8M
    json->integer = integer;
412
17.8M
    return json;
413
17.8M
}
414
415
struct json *
416
json_real_create(double real)
417
69.6k
{
418
69.6k
    struct json *json = json_create(JSON_REAL);
419
69.6k
    json->real = real;
420
69.6k
    return json;
421
69.6k
}
422
423
void
424
json_object_put(struct json *json, const char *name, struct json *value)
425
798
{
426
798
    json_destroy(shash_replace(json->object, name, value));
427
798
}
428
429
void
430
json_object_put_nocopy(struct json *json, char *name, struct json *value)
431
67.8k
{
432
67.8k
    json_destroy(shash_replace_nocopy(json->object, name, value));
433
67.8k
}
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.6k
{
461
17.6k
    ovs_assert(json->type == JSON_STRING);
462
17.6k
    return json->storage_type == JSON_STRING_DYNAMIC
463
17.6k
           ? json->str_ptr : json->str;
464
17.6k
}
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
957k
{
476
957k
    ovs_assert(json->type == JSON_ARRAY);
477
957k
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
478
336k
        return json->array.size;
479
336k
    }
480
620k
    return json->storage_type - JSON_ARRAY_DYNAMIC;
481
957k
}
482
483
const struct json *
484
json_array_at(const struct json *json, size_t index)
485
39.7M
{
486
39.7M
    ovs_assert(json->type == JSON_ARRAY);
487
488
39.7M
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
489
39.0M
        if (json->array.size <= index) {
490
0
            return NULL;
491
0
        }
492
39.0M
        return json->array.elements[index];
493
39.0M
    }
494
495
664k
    if (json->storage_type - JSON_ARRAY_DYNAMIC <= index) {
496
0
        return NULL;
497
0
    }
498
664k
    return json->elements[index];
499
664k
}
500
501
struct shash *
502
json_object(const struct json *json)
503
796
{
504
796
    ovs_assert(json->type == JSON_OBJECT);
505
796
    return CONST_CAST(struct shash *, json->object);
506
796
}
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
19.6M
{
536
19.6M
    switch (json->type) {
537
1.24M
    case JSON_OBJECT:
538
1.24M
        json_destroy_object(json->object, yield);
539
1.24M
        break;
540
541
439k
    case JSON_ARRAY:
542
439k
        json_destroy_array(json, yield);
543
439k
        break;
544
545
22.7k
    case JSON_STRING:
546
22.7k
        if (json->storage_type == JSON_STRING_DYNAMIC) {
547
3.56k
            free(json->str_ptr);
548
3.56k
        }
549
22.7k
        break;
550
551
0
    case JSON_SERIALIZED_OBJECT:
552
0
        free(json->str_ptr);
553
0
        break;
554
555
41.3k
    case JSON_NULL:
556
42.8k
    case JSON_FALSE:
557
44.5k
    case JSON_TRUE:
558
17.9M
    case JSON_INTEGER:
559
17.9M
    case JSON_REAL:
560
17.9M
        break;
561
562
0
    case JSON_N_TYPES:
563
0
        OVS_NOT_REACHED();
564
19.6M
    }
565
19.6M
    free(json);
566
19.6M
}
567
568
static void
569
json_destroy_object(struct shash *object, bool yield)
570
1.24M
{
571
1.24M
    struct shash_node *node;
572
573
1.24M
    if (yield) {
574
0
        cooperative_multitasking_yield();
575
0
    }
576
577
1.24M
    SHASH_FOR_EACH_SAFE (node, object) {
578
63.3k
        struct json *value = node->data;
579
580
63.3k
        if (yield) {
581
0
            json_destroy_with_yield(value);
582
63.3k
        } else {
583
63.3k
            json_destroy(value);
584
63.3k
        }
585
63.3k
        shash_delete(object, node);
586
63.3k
    }
587
1.24M
    shash_destroy(object);
588
1.24M
    free(object);
589
1.24M
}
590
591
static void
592
json_destroy_array(struct json *json, bool yield)
593
439k
{
594
439k
    size_t i, n = json_array_size(json);
595
596
439k
    if (yield) {
597
0
        cooperative_multitasking_yield();
598
0
    }
599
600
20.0M
    for (i = 0; i < n; i++) {
601
19.6M
        if (yield) {
602
0
            json_destroy_with_yield(
603
0
                CONST_CAST(struct json *, json_array_at(json, i)));
604
19.6M
        } else {
605
19.6M
            json_destroy(CONST_CAST(struct json *, json_array_at(json, i)));
606
19.6M
        }
607
19.6M
    }
608
439k
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
609
118k
        free(json->array.elements);
610
118k
    }
611
439k
}
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
44.4k
{
845
44.4k
    struct json_token token;
846
44.4k
    const char *s;
847
848
44.4k
    s = ds_cstr(&p->buffer);
849
44.4k
    if (!strcmp(s, "false")) {
850
1.52k
        token.type = T_FALSE;
851
42.8k
    } else if (!strcmp(s, "true")) {
852
1.63k
        token.type = T_TRUE;
853
41.2k
    } else if (!strcmp(s, "null")) {
854
41.1k
        token.type = T_NULL;
855
41.1k
    } else {
856
152
        json_error(p, "invalid keyword '%s'", s);
857
152
        return;
858
152
    }
859
44.2k
    json_parser_input(p, &token);
860
44.2k
}
861
862
static void
863
json_lex_number(struct json_parser *p)
864
17.9M
{
865
17.9M
    const char *cp = ds_cstr(&p->buffer);
866
17.9M
    unsigned long long int significand = 0;
867
17.9M
    struct json_token token;
868
17.9M
    bool imprecise = false;
869
17.9M
    bool negative = false;
870
17.9M
    int pow10 = 0;
871
872
    /* Leading minus sign. */
873
17.9M
    if (*cp == '-') {
874
25.3k
        negative = true;
875
25.3k
        cp++;
876
25.3k
    }
877
878
    /* At least one integer digit, but 0 may not be used as a leading digit for
879
     * a longer number. */
880
17.9M
    significand = 0;
881
17.9M
    if (*cp == '0') {
882
11.2M
        cp++;
883
11.2M
        if (isdigit((unsigned char) *cp)) {
884
1
            json_error(p, "leading zeros not allowed");
885
1
            return;
886
1
        }
887
11.2M
    } else if (isdigit((unsigned char) *cp)) {
888
10.3M
        do {
889
10.3M
            if (significand <= ULLONG_MAX / 10) {
890
9.16M
                significand = significand * 10 + (*cp - '0');
891
9.16M
            } else {
892
1.14M
                pow10++;
893
1.14M
                if (*cp != '0') {
894
104k
                    imprecise = true;
895
104k
                }
896
1.14M
            }
897
10.3M
            cp++;
898
10.3M
        } while (isdigit((unsigned char) *cp));
899
6.65M
    } else {
900
10
        json_error(p, "'-' must be followed by digit");
901
10
        return;
902
10
    }
903
904
    /* Optional fraction. */
905
17.9M
    if (*cp == '.') {
906
36.7k
        cp++;
907
36.7k
        if (!isdigit((unsigned char) *cp)) {
908
1
            json_error(p, "decimal point must be followed by digit");
909
1
            return;
910
1
        }
911
53.4k
        do {
912
53.4k
            if (significand <= ULLONG_MAX / 10) {
913
51.5k
                significand = significand * 10 + (*cp - '0');
914
51.5k
                pow10--;
915
51.5k
            } else if (*cp != '0') {
916
1.39k
                imprecise = true;
917
1.39k
            }
918
53.4k
            cp++;
919
53.4k
        } while (isdigit((unsigned char) *cp));
920
36.7k
    }
921
922
    /* Optional exponent. */
923
17.9M
    if (*cp == 'e' || *cp == 'E') {
924
4.67k
        bool negative_exponent = false;
925
4.67k
        int exponent;
926
927
4.67k
        cp++;
928
4.67k
        if (*cp == '+') {
929
1.98k
            cp++;
930
2.68k
        } else if (*cp == '-') {
931
497
            negative_exponent = true;
932
497
            cp++;
933
497
        }
934
935
4.67k
        if (!isdigit((unsigned char) *cp)) {
936
29
            json_error(p, "exponent must contain at least one digit");
937
29
            return;
938
29
        }
939
940
4.64k
        exponent = 0;
941
9.49k
        do {
942
9.49k
            if (exponent >= INT_MAX / 10) {
943
6
                goto bad_exponent;
944
6
            }
945
9.48k
            exponent = exponent * 10 + (*cp - '0');
946
9.48k
            cp++;
947
9.48k
        } while (isdigit((unsigned char) *cp));
948
949
4.64k
        if (negative_exponent) {
950
492
            if (pow10 < INT_MIN + exponent) {
951
1
                goto bad_exponent;
952
1
            }
953
491
            pow10 -= exponent;
954
4.14k
        } else {
955
4.14k
            if (pow10 > INT_MAX - exponent) {
956
22
                goto bad_exponent;
957
22
            }
958
4.12k
            pow10 += exponent;
959
4.12k
        }
960
4.64k
    }
961
962
17.9M
    if (*cp != '\0') {
963
5
        json_error(p, "syntax error in number");
964
5
        return;
965
5
    }
966
967
    /* Figure out number.
968
     *
969
     * We suppress negative zeros as a matter of policy. */
970
17.9M
    if (!significand) {
971
11.2M
        token.type = T_INTEGER;
972
11.2M
        token.integer = 0;
973
11.2M
        json_parser_input(p, &token);
974
11.2M
        return;
975
11.2M
    }
976
977
6.65M
    if (!imprecise) {
978
6.66M
        while (pow10 > 0 && significand < ULLONG_MAX / 10) {
979
46.8k
            significand *= 10;
980
46.8k
            pow10--;
981
46.8k
        }
982
6.62M
        while (pow10 < 0 && significand % 10 == 0) {
983
8.61k
            significand /= 10;
984
8.61k
            pow10++;
985
8.61k
        }
986
6.61M
        if (pow10 == 0
987
6.59M
            && significand <= (negative
988
6.59M
                               ? (unsigned long long int) LLONG_MAX + 1
989
6.59M
                               : LLONG_MAX)) {
990
6.58M
            token.type = T_INTEGER;
991
6.58M
            token.integer = negative ? -significand : significand;
992
6.58M
            json_parser_input(p, &token);
993
6.58M
            return;
994
6.58M
        }
995
6.61M
    }
996
997
70.2k
    token.type = T_REAL;
998
70.2k
    if (!str_to_double(ds_cstr(&p->buffer), &token.real)) {
999
63
        json_error(p, "number outside valid range");
1000
63
        return;
1001
63
    }
1002
    /* Suppress negative zero. */
1003
70.1k
    if (token.real == 0) {
1004
259
        token.real = 0;
1005
259
    }
1006
70.1k
    json_parser_input(p, &token);
1007
70.1k
    return;
1008
1009
29
bad_exponent:
1010
29
    json_error(p, "exponent outside valid range");
1011
29
}
1012
1013
static const char *
1014
json_lex_4hex(const char *cp, const char *end, int *valuep)
1015
7.39k
{
1016
7.39k
    unsigned int value;
1017
7.39k
    bool ok;
1018
1019
7.39k
    if (cp + 4 > end) {
1020
7
        return "quoted string ends within \\u escape";
1021
7
    }
1022
1023
7.39k
    value = hexits_value(cp, 4, &ok);
1024
7.39k
    if (!ok) {
1025
16
        return "malformed \\u escape";
1026
16
    }
1027
7.37k
    if (!value) {
1028
6
        return "null bytes not supported in quoted strings";
1029
6
    }
1030
7.36k
    *valuep = value;
1031
7.36k
    return NULL;
1032
7.37k
}
1033
1034
static const char *
1035
json_lex_unicode(const char *cp, const char *end, struct ds *out)
1036
6.04k
{
1037
6.04k
    const char *error;
1038
6.04k
    int c0, c1;
1039
1040
6.04k
    error = json_lex_4hex(cp, end, &c0);
1041
6.04k
    if (error) {
1042
22
        ds_clear(out);
1043
22
        ds_put_cstr(out, error);
1044
22
        return NULL;
1045
22
    }
1046
6.02k
    cp += 4;
1047
6.02k
    if (!uc_is_leading_surrogate(c0)) {
1048
4.64k
        ds_put_utf8(out, c0);
1049
4.64k
        return cp;
1050
4.64k
    }
1051
1052
1.38k
    if (cp + 2 > end || *cp++ != '\\' || *cp++ != 'u') {
1053
33
        ds_clear(out);
1054
33
        ds_put_cstr(out, "malformed escaped surrogate pair");
1055
33
        return NULL;
1056
33
    }
1057
1058
1.34k
    error = json_lex_4hex(cp, end, &c1);
1059
1.34k
    if (error) {
1060
7
        ds_clear(out);
1061
7
        ds_put_cstr(out, error);
1062
7
        return NULL;
1063
7
    }
1064
1.34k
    cp += 4;
1065
1.34k
    if (!uc_is_trailing_surrogate(c1)) {
1066
25
        ds_clear(out);
1067
25
        ds_put_cstr(out, "second half of escaped surrogate pair is not "
1068
25
                    "trailing surrogate");
1069
25
        return NULL;
1070
25
    }
1071
1072
1.31k
    ds_put_utf8(out, utf16_decode_surrogate_pair(c0, c1));
1073
1.31k
    return cp;
1074
1.34k
}
1075
1076
bool
1077
json_string_unescape(const char *in, size_t in_len, char **outp)
1078
17.2k
{
1079
17.2k
    const char *end = in + in_len;
1080
17.2k
    bool ok = false;
1081
17.2k
    struct ds out;
1082
1083
17.2k
    ds_init(&out);
1084
17.2k
    ds_reserve(&out, in_len);
1085
25.9M
    while (in < end) {
1086
25.9M
        if (*in == '"') {
1087
0
            ds_clear(&out);
1088
0
            ds_put_cstr(&out, "quoted string may not include unescaped \"");
1089
0
            goto exit;
1090
0
        }
1091
25.9M
        if (*in != '\\') {
1092
25.5M
            ds_put_char(&out, *in++);
1093
25.5M
            continue;
1094
25.5M
        }
1095
1096
381k
        in++;
1097
381k
        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
0
            ds_clear(&out);
1103
0
            ds_put_cstr(&out, "quoted string may not end with backslash");
1104
0
            goto exit;
1105
0
        }
1106
381k
        switch (*in++) {
1107
356k
        case '"': case '\\': case '/':
1108
356k
            ds_put_char(&out, in[-1]);
1109
356k
            break;
1110
1111
1.74k
        case 'b':
1112
1.74k
            ds_put_char(&out, '\b');
1113
1.74k
            break;
1114
1115
9.45k
        case 'f':
1116
9.45k
            ds_put_char(&out, '\f');
1117
9.45k
            break;
1118
1119
1.02k
        case 'n':
1120
1.02k
            ds_put_char(&out, '\n');
1121
1.02k
            break;
1122
1123
1.93k
        case 'r':
1124
1.93k
            ds_put_char(&out, '\r');
1125
1.93k
            break;
1126
1127
4.35k
        case 't':
1128
4.35k
            ds_put_char(&out, '\t');
1129
4.35k
            break;
1130
1131
6.04k
        case 'u':
1132
6.04k
            in = json_lex_unicode(in, end, &out);
1133
6.04k
            if (!in) {
1134
87
                goto exit;
1135
87
            }
1136
5.96k
            break;
1137
1138
5.96k
        default:
1139
23
            ds_clear(&out);
1140
23
            ds_put_format(&out, "bad escape \\%c", in[-1]);
1141
23
            goto exit;
1142
381k
        }
1143
381k
    }
1144
17.1k
    ok = true;
1145
1146
17.2k
exit:
1147
17.2k
    *outp = ds_cstr(&out);
1148
17.2k
    return ok;
1149
17.1k
}
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
88.4k
{
1165
88.4k
    struct json_token token;
1166
1167
88.4k
    token.type = T_STRING;
1168
88.4k
    token.string = s;
1169
88.4k
    json_parser_input(p, &token);
1170
88.4k
}
1171
1172
static void
1173
json_lex_string(struct json_parser *p)
1174
88.5k
{
1175
88.5k
    const char *raw = ds_cstr(&p->buffer);
1176
88.5k
    if (!strchr(raw, '\\')) {
1177
71.3k
        json_parser_input_string(p, raw);
1178
71.3k
    } else {
1179
17.2k
        char *cooked;
1180
1181
17.2k
        if (json_string_unescape(raw, strlen(raw), &cooked)) {
1182
17.1k
            json_parser_input_string(p, cooked);
1183
17.1k
        } else {
1184
110
            json_error(p, "%s", cooked);
1185
110
        }
1186
1187
17.2k
        free(cooked);
1188
17.2k
    }
1189
88.5k
}
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
4.10k
{
1211
4.10k
    struct json_parser *p = json_parser_create(JSPF_TRAILER);
1212
4.10k
    json_parser_feed(p, string, strlen(string));
1213
4.10k
    return json_parser_finish(p);
1214
4.10k
}
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
    while (!(feof(stream) || ferror(stream))) {
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
4.10k
{
1287
4.10k
    struct json_parser *p = xzalloc(sizeof *p);
1288
4.10k
    p->flags = flags;
1289
4.10k
    return p;
1290
4.10k
}
1291
1292
static inline void ALWAYS_INLINE
1293
json_parser_account_byte(struct json_parser *p, unsigned char c)
1294
77.5M
{
1295
77.5M
    p->byte_number++;
1296
77.5M
    if (OVS_UNLIKELY(c == '\n')) {
1297
361
        p->column_number = 0;
1298
361
        p->line_number++;
1299
77.5M
    } else {
1300
77.5M
        p->column_number++;
1301
77.5M
    }
1302
77.5M
}
1303
1304
size_t
1305
json_parser_feed(struct json_parser *p, const char *input, size_t n)
1306
5.54k
{
1307
5.54k
    size_t token_start = 0;
1308
5.54k
    size_t i;
1309
1310
95.4M
    for (i = 0; !p->done && i < n; ) {
1311
95.4M
        bool consumed = true;
1312
1313
95.4M
        const char *start_p = &input[token_start];
1314
95.4M
        unsigned char c = input[i];
1315
95.4M
        struct json_token token;
1316
1317
95.4M
        switch (p->lex_state) {
1318
40.7M
        case JSON_LEX_START:
1319
40.7M
            switch (c) {
1320
1.64k
            case ' ': case '\t': case '\n': case '\r':
1321
                /* Nothing to do. */
1322
1.64k
                token_start = i + 1;
1323
1.64k
                break;
1324
1325
14
            case 'a': case 'b': case 'c': case 'd': case 'e':
1326
1.58k
            case 'f': case 'g': case 'h': case 'i': case 'j':
1327
42.7k
            case 'k': case 'l': case 'm': case 'n': case 'o':
1328
44.4k
            case 'p': case 'q': case 'r': case 's': case 't':
1329
44.4k
            case 'u': case 'v': case 'w': case 'x': case 'y':
1330
44.4k
            case 'z':
1331
44.4k
                p->lex_state = JSON_LEX_KEYWORD;
1332
44.4k
                token_start = i;
1333
44.4k
                break;
1334
1335
22.7M
            case '[': case '{': case ']': case '}': case ':': case ',':
1336
22.7M
                token.type = c;
1337
22.7M
                json_parser_input(p, &token);
1338
22.7M
                token_start = i + 1;
1339
22.7M
                break;
1340
1341
25.3k
            case '-':
1342
17.0M
            case '0': case '1': case '2': case '3': case '4':
1343
17.9M
            case '5': case '6': case '7': case '8': case '9':
1344
17.9M
                p->lex_state = JSON_LEX_NUMBER;
1345
17.9M
                token_start = i;
1346
17.9M
                break;
1347
1348
88.6k
            case '"':
1349
88.6k
                p->lex_state = JSON_LEX_STRING;
1350
88.6k
                token_start = i + 1;
1351
88.6k
                break;
1352
1353
13
            default:
1354
13
                if (isprint(c)) {
1355
7
                    json_error(p, "invalid character '%c'", c);
1356
7
                } else {
1357
6
                    json_error(p, "invalid character U+%04x", c);
1358
6
                }
1359
13
                break;
1360
40.7M
            }
1361
40.7M
            break;
1362
1363
40.7M
        case JSON_LEX_KEYWORD:
1364
2.27M
            if (!isalpha((unsigned char) c)) {
1365
44.4k
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1366
44.4k
                json_lex_keyword(p);
1367
44.4k
                consumed = false;
1368
44.4k
                break;
1369
44.4k
            }
1370
2.23M
            break;
1371
1372
21.7M
        case JSON_LEX_NUMBER:
1373
21.7M
            if (!strchr(".0123456789eE-+", c)) {
1374
17.9M
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1375
17.9M
                json_lex_number(p);
1376
17.9M
                consumed = false;
1377
17.9M
                break;
1378
17.9M
            }
1379
3.79M
            break;
1380
1381
30.3M
        case JSON_LEX_STRING:
1382
30.3M
            if (c == '\\') {
1383
387k
                p->lex_state = JSON_LEX_ESCAPE;
1384
29.9M
            } else if (c == '"') {
1385
88.5k
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1386
88.5k
                json_lex_string(p);
1387
29.8M
            } else if (c < 0x20) {
1388
8
                json_error(p, "U+%04X must be escaped in quoted string", c);
1389
8
            }
1390
30.3M
            break;
1391
1392
387k
        case JSON_LEX_ESCAPE:
1393
387k
            p->lex_state = JSON_LEX_STRING;
1394
387k
            break;
1395
1396
0
        default:
1397
0
            ovs_abort(0, "unexpected lexer state");
1398
95.4M
        }
1399
1400
95.4M
        if (consumed) {
1401
77.5M
            json_parser_account_byte(p, c);
1402
77.5M
            i++;
1403
77.5M
        }
1404
95.4M
    }
1405
1406
5.54k
    if (!p->done) {
1407
3.86k
        ds_put_buffer(&p->buffer, &input[token_start], i - token_start);
1408
3.86k
    }
1409
5.54k
    return i;
1410
5.54k
}
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
4.10k
{
1421
4.10k
    struct json *json;
1422
1423
4.10k
    switch (p->lex_state) {
1424
2.50k
    case JSON_LEX_START:
1425
2.50k
        break;
1426
1427
155
    case JSON_LEX_STRING:
1428
163
    case JSON_LEX_ESCAPE:
1429
163
        json_error(p, "unexpected end of input in quoted string");
1430
163
        break;
1431
1432
1.24k
    case JSON_LEX_NUMBER:
1433
1.43k
    case JSON_LEX_KEYWORD:
1434
1.43k
        json_parser_feed(p, " ", 1);
1435
1.43k
        break;
1436
4.10k
    }
1437
1438
4.10k
    if (p->parse_state == JSON_PARSE_START) {
1439
1.53k
        json_error(p, "empty input stream");
1440
2.57k
    } else if (p->parse_state != JSON_PARSE_END) {
1441
1.02k
        json_error(p, "unexpected end of input");
1442
1.02k
    }
1443
1444
4.10k
    if (!p->error) {
1445
1.53k
        ovs_assert(p->height == 1);
1446
1.53k
        ovs_assert(p->stack[0].json != NULL);
1447
1.53k
        json = p->stack[--p->height].json;
1448
2.57k
    } else {
1449
2.57k
        json = json_string_create_nocopy(p->error);
1450
2.57k
        p->error = NULL;
1451
2.57k
    }
1452
1453
4.10k
    json_parser_abort(p);
1454
1455
4.10k
    return json;
1456
4.10k
}
1457
1458
void
1459
json_parser_abort(struct json_parser *p)
1460
4.10k
{
1461
4.10k
    if (p) {
1462
4.10k
        ds_destroy(&p->buffer);
1463
4.10k
        if (p->height) {
1464
1.04k
            json_destroy(p->stack[0].json);
1465
1.04k
        }
1466
4.10k
        free(p->stack);
1467
4.10k
        free(p->member_name);
1468
4.10k
        free(p->error);
1469
4.10k
        free(p);
1470
4.10k
    }
1471
4.10k
}
1472
1473
static struct json_parser_node *
1474
json_parser_top(struct json_parser *p)
1475
22.9M
{
1476
22.9M
    return &p->stack[p->height - 1];
1477
22.9M
}
1478
1479
static void
1480
json_parser_put_value(struct json_parser *p, struct json *value)
1481
19.6M
{
1482
19.6M
    struct json_parser_node *node = json_parser_top(p);
1483
19.6M
    if (node->json->type == JSON_OBJECT) {
1484
67.8k
        json_object_put_nocopy(node->json, p->member_name, value);
1485
67.8k
        p->member_name = NULL;
1486
19.6M
    } else if (node->json->type == JSON_ARRAY) {
1487
19.6M
        json_array_add(node->json, value);
1488
19.6M
    } else {
1489
0
        OVS_NOT_REACHED();
1490
0
    }
1491
19.6M
}
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.68M
{
1497
1.68M
    if (p->height < JSON_MAX_HEIGHT) {
1498
1.68M
        struct json_parser_node *node;
1499
1500
1.68M
        if (p->height >= p->allocated_height) {
1501
9.61k
            p->stack = x2nrealloc(p->stack, &p->allocated_height,
1502
9.61k
                                  sizeof *p->stack);
1503
9.61k
        }
1504
1505
1.68M
        if (p->height > 0) {
1506
1.68M
            json_parser_put_value(p, new_json);
1507
1.68M
        }
1508
1509
1.68M
        node = &p->stack[p->height++];
1510
1.68M
        node->json = new_json;
1511
1.68M
        p->parse_state = new_state;
1512
1.68M
    } 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.68M
}
1518
1519
static void
1520
json_parser_push_object(struct json_parser *p)
1521
1.24M
{
1522
1.24M
    json_parser_push(p, json_object_create(), JSON_PARSE_OBJECT_INIT);
1523
1.24M
}
1524
1525
static void
1526
json_parser_push_array(struct json_parser *p)
1527
439k
{
1528
439k
    json_parser_push(p, json_array_create_empty(), JSON_PARSE_ARRAY_INIT);
1529
439k
}
1530
1531
static void
1532
json_parse_value(struct json_parser *p, struct json_token *token,
1533
                 enum json_parse_state next_state)
1534
19.6M
{
1535
19.6M
    struct json *value;
1536
1537
19.6M
    switch (token->type) {
1538
1.52k
    case T_FALSE:
1539
1.52k
        value = json_boolean_create(false);
1540
1.52k
        break;
1541
1542
41.1k
    case T_NULL:
1543
41.1k
        value = json_null_create();
1544
41.1k
        break;
1545
1546
1.62k
    case T_TRUE:
1547
1.62k
        value = json_boolean_create(true);
1548
1.62k
        break;
1549
1550
1.24M
    case '{':
1551
1.24M
        json_parser_push_object(p);
1552
1.24M
        return;
1553
1554
438k
    case '[':
1555
438k
        json_parser_push_array(p);
1556
438k
        return;
1557
1558
17.8M
    case T_INTEGER:
1559
17.8M
        value = json_integer_create(token->integer);
1560
17.8M
        break;
1561
1562
69.6k
    case T_REAL:
1563
69.6k
        value = json_real_create(token->real);
1564
69.6k
        break;
1565
1566
20.1k
    case T_STRING:
1567
20.1k
        value = json_string_create(token->string);
1568
20.1k
        break;
1569
1570
0
    case T_EOF:
1571
2
    case '}':
1572
2
    case ']':
1573
12
    case ':':
1574
18
    case ',':
1575
18
    default:
1576
18
        json_error(p, "syntax error expecting value");
1577
18
        return;
1578
19.6M
    }
1579
1580
17.9M
    json_parser_put_value(p, value);
1581
17.9M
    p->parse_state = next_state;
1582
17.9M
}
1583
1584
static void
1585
json_parser_pop(struct json_parser *p)
1586
1.65M
{
1587
1.65M
    struct json_parser_node *node;
1588
1589
    /* Conserve memory. */
1590
1.65M
    node = json_parser_top(p);
1591
1.65M
    if (node->json->type == JSON_ARRAY) {
1592
410k
        json_array_trim(node->json);
1593
410k
    }
1594
1595
    /* Pop off the top-of-stack. */
1596
1.65M
    if (p->height == 1) {
1597
1.55k
        p->parse_state = JSON_PARSE_END;
1598
1.55k
        if (!(p->flags & JSPF_TRAILER)) {
1599
0
            p->done = true;
1600
0
        }
1601
1.64M
    } else {
1602
1.64M
        p->height--;
1603
1.64M
        node = json_parser_top(p);
1604
1.64M
        if (node->json->type == JSON_ARRAY) {
1605
1.64M
            p->parse_state = JSON_PARSE_ARRAY_NEXT;
1606
1.64M
        } else if (node->json->type == JSON_OBJECT) {
1607
5.00k
            p->parse_state = JSON_PARSE_OBJECT_NEXT;
1608
5.00k
        } else {
1609
0
            OVS_NOT_REACHED();
1610
0
        }
1611
1.64M
    }
1612
1.65M
}
1613
1614
static void
1615
json_parser_input(struct json_parser *p, struct json_token *token)
1616
40.7M
{
1617
40.7M
    switch (p->parse_state) {
1618
3.68k
    case JSON_PARSE_START:
1619
3.68k
        if (token->type == '{') {
1620
1.28k
            json_parser_push_object(p);
1621
2.40k
        } else if (token->type == '[') {
1622
1.28k
            json_parser_push_array(p);
1623
1.28k
        } else {
1624
1.11k
            json_error(p, "syntax error at beginning of input");
1625
1.11k
        }
1626
3.68k
        break;
1627
1628
17
    case JSON_PARSE_END:
1629
17
        json_error(p, "trailing garbage at end of input");
1630
17
        break;
1631
1632
1.24M
    case JSON_PARSE_OBJECT_INIT:
1633
1.24M
        if (token->type == '}') {
1634
1.23M
            json_parser_pop(p);
1635
1.23M
            break;
1636
1.23M
        }
1637
        /* Fall through. */
1638
67.9k
    case JSON_PARSE_OBJECT_NAME:
1639
67.9k
        if (token->type == T_STRING) {
1640
67.8k
            p->member_name = xstrdup(token->string);
1641
67.8k
            p->parse_state = JSON_PARSE_OBJECT_COLON;
1642
67.8k
        } else {
1643
31
            json_error(p, "syntax error parsing object expecting string");
1644
31
        }
1645
67.9k
        break;
1646
1647
67.8k
    case JSON_PARSE_OBJECT_COLON:
1648
67.8k
        if (token->type == ':') {
1649
67.8k
            p->parse_state = JSON_PARSE_OBJECT_VALUE;
1650
67.8k
        } else {
1651
14
            json_error(p, "syntax error parsing object expecting ':'");
1652
14
        }
1653
67.8k
        break;
1654
1655
67.8k
    case JSON_PARSE_OBJECT_VALUE:
1656
67.8k
        json_parse_value(p, token, JSON_PARSE_OBJECT_NEXT);
1657
67.8k
        break;
1658
1659
65.1k
    case JSON_PARSE_OBJECT_NEXT:
1660
65.1k
        if (token->type == ',') {
1661
54.8k
            p->parse_state = JSON_PARSE_OBJECT_NAME;
1662
54.8k
        } else if (token->type == '}') {
1663
10.3k
            json_parser_pop(p);
1664
10.3k
        } else {
1665
15
            json_error(p, "syntax error expecting '}' or ','");
1666
15
        }
1667
65.1k
        break;
1668
1669
439k
    case JSON_PARSE_ARRAY_INIT:
1670
439k
        if (token->type == ']') {
1671
110k
            json_parser_pop(p);
1672
110k
            break;
1673
110k
        }
1674
        /* Fall through. */
1675
19.6M
    case JSON_PARSE_ARRAY_VALUE:
1676
19.6M
        json_parse_value(p, token, JSON_PARSE_ARRAY_NEXT);
1677
19.6M
        break;
1678
1679
19.5M
    case JSON_PARSE_ARRAY_NEXT:
1680
19.5M
        if (token->type == ',') {
1681
19.2M
            p->parse_state = JSON_PARSE_ARRAY_VALUE;
1682
19.2M
        } else if (token->type == ']') {
1683
300k
            json_parser_pop(p);
1684
300k
        } else {
1685
36
            json_error(p, "syntax error expecting ']' or ','");
1686
36
        }
1687
19.5M
        break;
1688
1689
0
    default:
1690
0
        abort();
1691
40.7M
    }
1692
1693
40.7M
    p->lex_state = JSON_LEX_START;
1694
40.7M
    ds_clear(&p->buffer);
1695
40.7M
}
1696
1697
static struct json *
1698
json_create(enum json_type type)
1699
19.6M
{
1700
19.6M
    struct json *json = xmalloc(sizeof *json);
1701
19.6M
    json->type = type;
1702
19.6M
    json->count = 1;
1703
19.6M
    return json;
1704
19.6M
}
1705
1706
static void
1707
json_error(struct json_parser *p, const char *format, ...)
1708
4.38k
{
1709
4.38k
    if (!p->error) {
1710
2.57k
        struct ds msg;
1711
2.57k
        va_list args;
1712
1713
2.57k
        ds_init(&msg);
1714
2.57k
        ds_put_format(&msg, "line %d, column %d, byte %d: ",
1715
2.57k
                      p->line_number, p->column_number, p->byte_number);
1716
2.57k
        va_start(args, format);
1717
2.57k
        ds_put_format_valist(&msg, format, args);
1718
2.57k
        va_end(args);
1719
1720
2.57k
        p->error = ds_steal_cstr(&msg);
1721
1722
2.57k
        p->done = true;
1723
2.57k
    }
1724
4.38k
}
1725

1726
21.4M
#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.80k
{
1758
1.80k
    struct ds ds;
1759
1760
1.80k
    ds_init(&ds);
1761
1.80k
    json_to_ds(json, flags, &ds);
1762
1.80k
    return ds_steal_cstr(&ds);
1763
1.80k
}
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.80k
{
1769
1.80k
    struct json_serializer s;
1770
1771
1.80k
    s.ds = ds;
1772
1.80k
    s.depth = 0;
1773
1.80k
    s.flags = flags;
1774
1.80k
    json_serialize(json, &s);
1775
1.80k
}
1776
1777
static void
1778
json_serialize(const struct json *json, struct json_serializer *s)
1779
20.2M
{
1780
20.2M
    struct ds *ds = s->ds;
1781
1782
20.2M
    switch (json->type) {
1783
41.0k
    case JSON_NULL:
1784
41.0k
        ds_put_cstr(ds, "null");
1785
41.0k
        break;
1786
1787
1.26k
    case JSON_FALSE:
1788
1.26k
        ds_put_cstr(ds, "false");
1789
1.26k
        break;
1790
1791
1.41k
    case JSON_TRUE:
1792
1.41k
        ds_put_cstr(ds, "true");
1793
1.41k
        break;
1794
1795
1.24M
    case JSON_OBJECT:
1796
1.24M
        json_serialize_object(json->object, s);
1797
1.24M
        break;
1798
1799
517k
    case JSON_ARRAY:
1800
517k
        json_serialize_array(json, s);
1801
517k
        break;
1802
1803
18.3M
    case JSON_INTEGER:
1804
18.3M
        ds_put_format(ds, "%lld", json->integer);
1805
18.3M
        break;
1806
1807
71.2k
    case JSON_REAL:
1808
71.2k
        ds_put_format(ds, "%.*g", DBL_DIG, json->real);
1809
71.2k
        break;
1810
1811
17.6k
    case JSON_STRING:
1812
17.6k
        json_serialize_string(json_string(json), ds);
1813
17.6k
        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
20.2M
    }
1823
20.2M
}
1824
1825
static void
1826
indent_line(struct json_serializer *s)
1827
21.4M
{
1828
21.4M
    if (s->flags & JSSF_PRETTY) {
1829
21.4M
        ds_put_char(s->ds, '\n');
1830
21.4M
        ds_put_char_multiple(s->ds, ' ', SPACES_PER_LEVEL * s->depth);
1831
21.4M
    }
1832
21.4M
}
1833
1834
static void
1835
json_serialize_object_member(size_t i, const struct shash_node *node,
1836
                             struct json_serializer *s)
1837
57.6k
{
1838
57.6k
    struct ds *ds = s->ds;
1839
1840
57.6k
    if (i) {
1841
45.2k
        ds_put_char(ds, ',');
1842
45.2k
        indent_line(s);
1843
45.2k
    }
1844
1845
57.6k
    json_serialize_string(node->name, ds);
1846
57.6k
    ds_put_char(ds, ':');
1847
57.6k
    if (s->flags & JSSF_PRETTY) {
1848
57.6k
        ds_put_char(ds, ' ');
1849
57.6k
    }
1850
57.6k
    json_serialize(node->data, s);
1851
57.6k
}
1852
1853
static void
1854
json_serialize_object(const struct shash *object, struct json_serializer *s)
1855
1.24M
{
1856
1.24M
    struct ds *ds = s->ds;
1857
1858
1.24M
    ds_put_char(ds, '{');
1859
1860
1.24M
    s->depth++;
1861
1.24M
    indent_line(s);
1862
1863
1.24M
    if (s->flags & JSSF_YIELD) {
1864
0
        cooperative_multitasking_yield();
1865
0
    }
1866
1867
1.24M
    if (s->flags & JSSF_SORT) {
1868
1.24M
        const struct shash_node **nodes;
1869
1.24M
        size_t n, i;
1870
1871
1.24M
        nodes = shash_sort(object);
1872
1.24M
        n = shash_count(object);
1873
1.30M
        for (i = 0; i < n; i++) {
1874
57.6k
            json_serialize_object_member(i, nodes[i], s);
1875
57.6k
        }
1876
1.24M
        free(nodes);
1877
1.24M
    } 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.24M
    ds_put_char(ds, '}');
1888
1.24M
    s->depth--;
1889
1.24M
}
1890
1891
static void
1892
json_serialize_array(const struct json *json, struct json_serializer *s)
1893
517k
{
1894
517k
    size_t i, n = json_array_size(json);
1895
517k
    struct ds *ds = s->ds;
1896
1897
517k
    ds_put_char(ds, '[');
1898
517k
    s->depth++;
1899
1900
517k
    if (s->flags & JSSF_YIELD) {
1901
0
        cooperative_multitasking_yield();
1902
0
    }
1903
1904
517k
    if (n > 0) {
1905
309k
        indent_line(s);
1906
1907
20.4M
        for (i = 0; i < n; i++) {
1908
20.1M
            if (i) {
1909
19.8M
                ds_put_char(ds, ',');
1910
19.8M
                indent_line(s);
1911
19.8M
            }
1912
20.1M
            json_serialize(json_array_at(json, i), s);
1913
20.1M
        }
1914
309k
    }
1915
1916
517k
    s->depth--;
1917
517k
    ds_put_char(ds, ']');
1918
517k
}
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
75.2k
{
1958
75.2k
    uint8_t c;
1959
75.2k
    uint8_t c2;
1960
75.2k
    size_t count;
1961
75.2k
    const char *escape;
1962
75.2k
    const char *start;
1963
1964
75.2k
    ds_put_char(ds, '"');
1965
75.2k
    count = 0;
1966
75.2k
    start = string;
1967
18.3M
    while ((c = *string++) != '\0') {
1968
18.2M
        if (c >= ' ' && c != '"' && c != '\\') {
1969
17.5M
            count++;
1970
17.5M
        } else {
1971
667k
            if (count) {
1972
11.3k
                ds_put_buffer(ds, start, count);
1973
11.3k
                count = 0;
1974
11.3k
            }
1975
667k
            start = string;
1976
667k
            escape = chars_escaping[c];
1977
2.00M
            while ((c2 = *escape++) != '\0') {
1978
1.33M
                ds_put_char(ds, c2);
1979
1.33M
            }
1980
667k
        }
1981
18.2M
    }
1982
75.2k
    if (count) {
1983
58.0k
        ds_put_buffer(ds, start, count);
1984
58.0k
    }
1985
75.2k
    ds_put_char(ds, '"');
1986
75.2k
}