Coverage Report

Created: 2025-08-03 06:34

/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.51M
#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
53.1k
{
169
53.1k
    return json_create(JSON_NULL);
170
53.1k
}
171
172
struct json *
173
json_boolean_create(bool b)
174
4.10k
{
175
4.10k
    return json_create(b ? JSON_TRUE : JSON_FALSE);
176
4.10k
}
177
178
struct json *
179
json_string_create_nocopy(char *s)
180
2.60k
{
181
2.60k
    struct json *json = json_create(JSON_STRING);
182
2.60k
    json->storage_type = JSON_STRING_DYNAMIC;
183
2.60k
    json->str_ptr = s;
184
2.60k
    return json;
185
2.60k
}
186
187
struct json *
188
json_string_create(const char *s)
189
17.1k
{
190
17.1k
    struct json *json = json_create(JSON_STRING);
191
17.1k
    size_t length = strlen(s);
192
193
17.1k
    if (length <= JSON_STRING_INLINE_LEN) {
194
16.5k
        json->storage_type = JSON_STRING_INLINE;
195
16.5k
        memcpy(json->str, s, length);
196
16.5k
        json->str[length] = '\0';
197
16.5k
    } else {
198
611
        json->storage_type = JSON_STRING_DYNAMIC;
199
611
        json->str_ptr = xmemdup0(s, length);
200
611
    }
201
17.1k
    return json;
202
17.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
485k
{
228
485k
    struct json *json = json_create(JSON_ARRAY);
229
485k
    json->storage_type = JSON_ARRAY_DYNAMIC;
230
485k
    json->array.elements = NULL;
231
485k
    json->array.size = 0;
232
485k
    json->array.allocated = 0;
233
485k
    return json;
234
485k
}
235
236
void
237
json_array_add(struct json *array_, struct json *element)
238
17.2M
{
239
17.2M
    switch (array_->storage_type) {
240
17.2M
    case JSON_ARRAY_DYNAMIC:
241
17.2M
        if (!array_->array.size) {
242
324k
            array_->storage_type = JSON_ARRAY_INLINE_1;
243
324k
            array_->elements[0] = element;
244
324k
            return;
245
324k
        }
246
16.9M
        break;
247
248
16.9M
    case JSON_ARRAY_INLINE_1:
249
38.5k
    case JSON_ARRAY_INLINE_2:
250
38.5k
        array_->elements[array_->storage_type - JSON_ARRAY_DYNAMIC] = element;
251
38.5k
        array_->storage_type++;
252
38.5k
        return;
253
254
9.08k
    case JSON_ARRAY_INLINE_3: {
255
9.08k
        struct json **elements = xmalloc(4 * sizeof *elements);
256
257
9.08k
        memcpy(elements, array_->elements, 3 * sizeof array_->elements[0]);
258
9.08k
        array_->array.elements = elements;
259
9.08k
        array_->array.elements[3] = element;
260
9.08k
        array_->array.size = 4;
261
9.08k
        array_->array.allocated = 4;
262
9.08k
        array_->storage_type = JSON_ARRAY_DYNAMIC;
263
9.08k
        return;
264
26.7k
    }
265
266
0
    case JSON_STRING_DYNAMIC:
267
0
    case JSON_STRING_INLINE:
268
0
    default:
269
0
        OVS_NOT_REACHED();
270
17.2M
    }
271
272
16.9M
    struct json_array *array = &array_->array;
273
16.9M
    if (array->size >= array->allocated) {
274
24.4k
        array->elements = x2nrealloc(array->elements, &array->allocated,
275
24.4k
                                     sizeof *array->elements);
276
24.4k
    }
277
16.9M
    array->elements[array->size++] = element;
278
16.9M
}
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
456k
{
317
456k
    if (array_->storage_type != JSON_ARRAY_DYNAMIC) {
318
287k
        return;
319
287k
    }
320
321
169k
    struct json_array *array = &array_->array;
322
169k
    if (array->size < array->allocated) {
323
7.09k
        array->allocated = array->size;
324
7.09k
        array->elements = xrealloc(array->elements,
325
7.09k
                                   array->size * sizeof *array->elements);
326
7.09k
    }
327
169k
}
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.02M
{
394
1.02M
    struct json *json = json_create(JSON_OBJECT);
395
1.02M
    json->object = xmalloc(sizeof *json->object);
396
1.02M
    shash_init(json->object);
397
1.02M
    return json;
398
1.02M
}
399
400
struct json *
401
json_integer_create(long long int integer)
402
15.6M
{
403
15.6M
    struct json *json = json_create(JSON_INTEGER);
404
15.6M
    json->integer = integer;
405
15.6M
    return json;
406
15.6M
}
407
408
struct json *
409
json_real_create(double real)
410
58.5k
{
411
58.5k
    struct json *json = json_create(JSON_REAL);
412
58.5k
    json->real = real;
413
58.5k
    return json;
414
58.5k
}
415
416
void
417
json_object_put(struct json *json, const char *name, struct json *value)
418
768
{
419
768
    json_destroy(shash_replace(json->object, name, value));
420
768
}
421
422
void
423
json_object_put_nocopy(struct json *json, char *name, struct json *value)
424
32.7k
{
425
32.7k
    json_destroy(shash_replace_nocopy(json->object, name, value));
426
32.7k
}
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
16.0k
{
454
16.0k
    ovs_assert(json->type == JSON_STRING);
455
16.0k
    return json->storage_type == JSON_STRING_DYNAMIC
456
16.0k
           ? json->str_ptr : json->str;
457
16.0k
}
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
1.09M
{
469
1.09M
    ovs_assert(json->type == JSON_ARRAY);
470
1.09M
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
471
491k
        return json->array.size;
472
491k
    }
473
604k
    return json->storage_type - JSON_ARRAY_DYNAMIC;
474
1.09M
}
475
476
const struct json *
477
json_array_at(const struct json *json, size_t index)
478
35.3M
{
479
35.3M
    ovs_assert(json->type == JSON_ARRAY);
480
481
35.3M
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
482
34.7M
        if (json->array.size <= index) {
483
0
            return NULL;
484
0
        }
485
34.7M
        return json->array.elements[index];
486
34.7M
    }
487
488
645k
    if (json->storage_type - JSON_ARRAY_DYNAMIC <= index) {
489
0
        return NULL;
490
0
    }
491
645k
    return json->elements[index];
492
645k
}
493
494
struct shash *
495
json_object(const struct json *json)
496
710
{
497
710
    ovs_assert(json->type == JSON_OBJECT);
498
710
    return CONST_CAST(struct shash *, json->object);
499
710
}
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
17.3M
{
529
17.3M
    switch (json->type) {
530
1.02M
    case JSON_OBJECT:
531
1.02M
        json_destroy_object(json->object, yield);
532
1.02M
        break;
533
534
485k
    case JSON_ARRAY:
535
485k
        json_destroy_array(json, yield);
536
485k
        break;
537
538
19.7k
    case JSON_STRING:
539
19.7k
        if (json->storage_type == JSON_STRING_DYNAMIC) {
540
3.21k
            free(json->str_ptr);
541
3.21k
        }
542
19.7k
        break;
543
544
0
    case JSON_SERIALIZED_OBJECT:
545
0
        free(json->str_ptr);
546
0
        break;
547
548
53.1k
    case JSON_NULL:
549
54.6k
    case JSON_FALSE:
550
57.2k
    case JSON_TRUE:
551
15.7M
    case JSON_INTEGER:
552
15.8M
    case JSON_REAL:
553
15.8M
        break;
554
555
0
    case JSON_N_TYPES:
556
0
        OVS_NOT_REACHED();
557
17.3M
    }
558
17.3M
    free(json);
559
17.3M
}
560
561
static void
562
json_destroy_object(struct shash *object, bool yield)
563
1.02M
{
564
1.02M
    struct shash_node *node;
565
566
1.02M
    if (yield) {
567
0
        cooperative_multitasking_yield();
568
0
    }
569
570
1.02M
    SHASH_FOR_EACH_SAFE (node, object) {
571
31.2k
        struct json *value = node->data;
572
573
31.2k
        if (yield) {
574
0
            json_destroy_with_yield(value);
575
31.2k
        } else {
576
31.2k
            json_destroy(value);
577
31.2k
        }
578
31.2k
        shash_delete(object, node);
579
31.2k
    }
580
1.02M
    shash_destroy(object);
581
1.02M
    free(object);
582
1.02M
}
583
584
static void
585
json_destroy_array(struct json *json, bool yield)
586
485k
{
587
485k
    size_t i, n = json_array_size(json);
588
589
485k
    if (yield) {
590
0
        cooperative_multitasking_yield();
591
0
    }
592
593
17.7M
    for (i = 0; i < n; i++) {
594
17.2M
        if (yield) {
595
0
            json_destroy_with_yield(
596
0
                CONST_CAST(struct json *, json_array_at(json, i)));
597
17.2M
        } else {
598
17.2M
            json_destroy(CONST_CAST(struct json *, json_array_at(json, i)));
599
17.2M
        }
600
17.2M
    }
601
485k
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
602
170k
        free(json->array.elements);
603
170k
    }
604
485k
}
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
57.1k
{
838
57.1k
    struct json_token token;
839
57.1k
    const char *s;
840
841
57.1k
    s = ds_cstr(&p->buffer);
842
57.1k
    if (!strcmp(s, "false")) {
843
1.47k
        token.type = T_FALSE;
844
55.7k
    } else if (!strcmp(s, "true")) {
845
2.63k
        token.type = T_TRUE;
846
53.0k
    } else if (!strcmp(s, "null")) {
847
52.9k
        token.type = T_NULL;
848
52.9k
    } else {
849
134
        json_error(p, "invalid keyword '%s'", s);
850
134
        return;
851
134
    }
852
57.0k
    json_parser_input(p, &token);
853
57.0k
}
854
855
static void
856
json_lex_number(struct json_parser *p)
857
15.7M
{
858
15.7M
    const char *cp = ds_cstr(&p->buffer);
859
15.7M
    unsigned long long int significand = 0;
860
15.7M
    struct json_token token;
861
15.7M
    bool imprecise = false;
862
15.7M
    bool negative = false;
863
15.7M
    int pow10 = 0;
864
865
    /* Leading minus sign. */
866
15.7M
    if (*cp == '-') {
867
26.2k
        negative = true;
868
26.2k
        cp++;
869
26.2k
    }
870
871
    /* At least one integer digit, but 0 may not be used as a leading digit for
872
     * a longer number. */
873
15.7M
    significand = 0;
874
15.7M
    if (*cp == '0') {
875
9.38M
        cp++;
876
9.38M
        if (isdigit((unsigned char) *cp)) {
877
1
            json_error(p, "leading zeros not allowed");
878
1
            return;
879
1
        }
880
9.38M
    } else if (isdigit((unsigned char) *cp)) {
881
9.61M
        do {
882
9.61M
            if (significand <= ULLONG_MAX / 10) {
883
8.50M
                significand = significand * 10 + (*cp - '0');
884
8.50M
            } else {
885
1.10M
                pow10++;
886
1.10M
                if (*cp != '0') {
887
72.7k
                    imprecise = true;
888
72.7k
                }
889
1.10M
            }
890
9.61M
            cp++;
891
9.61M
        } while (isdigit((unsigned char) *cp));
892
6.36M
    } else {
893
10
        json_error(p, "'-' must be followed by digit");
894
10
        return;
895
10
    }
896
897
    /* Optional fraction. */
898
15.7M
    if (*cp == '.') {
899
41.1k
        cp++;
900
41.1k
        if (!isdigit((unsigned char) *cp)) {
901
2
            json_error(p, "decimal point must be followed by digit");
902
2
            return;
903
2
        }
904
52.4k
        do {
905
52.4k
            if (significand <= ULLONG_MAX / 10) {
906
51.2k
                significand = significand * 10 + (*cp - '0');
907
51.2k
                pow10--;
908
51.2k
            } else if (*cp != '0') {
909
859
                imprecise = true;
910
859
            }
911
52.4k
            cp++;
912
52.4k
        } while (isdigit((unsigned char) *cp));
913
41.1k
    }
914
915
    /* Optional exponent. */
916
15.7M
    if (*cp == 'e' || *cp == 'E') {
917
5.47k
        bool negative_exponent = false;
918
5.47k
        int exponent;
919
920
5.47k
        cp++;
921
5.47k
        if (*cp == '+') {
922
1.89k
            cp++;
923
3.58k
        } else if (*cp == '-') {
924
518
            negative_exponent = true;
925
518
            cp++;
926
518
        }
927
928
5.47k
        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.44k
        exponent = 0;
934
10.4k
        do {
935
10.4k
            if (exponent >= INT_MAX / 10) {
936
3
                goto bad_exponent;
937
3
            }
938
10.4k
            exponent = exponent * 10 + (*cp - '0');
939
10.4k
            cp++;
940
10.4k
        } while (isdigit((unsigned char) *cp));
941
942
5.44k
        if (negative_exponent) {
943
512
            if (pow10 < INT_MIN + exponent) {
944
1
                goto bad_exponent;
945
1
            }
946
511
            pow10 -= exponent;
947
4.93k
        } else {
948
4.93k
            if (pow10 > INT_MAX - exponent) {
949
20
                goto bad_exponent;
950
20
            }
951
4.91k
            pow10 += exponent;
952
4.91k
        }
953
5.44k
    }
954
955
15.7M
    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
15.7M
    if (!significand) {
964
9.37M
        token.type = T_INTEGER;
965
9.37M
        token.integer = 0;
966
9.37M
        json_parser_input(p, &token);
967
9.37M
        return;
968
9.37M
    }
969
970
6.36M
    if (!imprecise) {
971
6.39M
        while (pow10 > 0 && significand < ULLONG_MAX / 10) {
972
52.5k
            significand *= 10;
973
52.5k
            pow10--;
974
52.5k
        }
975
6.34M
        while (pow10 < 0 && significand % 10 == 0) {
976
5.50k
            significand /= 10;
977
5.50k
            pow10++;
978
5.50k
        }
979
6.34M
        if (pow10 == 0
980
6.34M
            && significand <= (negative
981
6.31M
                               ? (unsigned long long int) LLONG_MAX + 1
982
6.31M
                               : LLONG_MAX)) {
983
6.30M
            token.type = T_INTEGER;
984
6.30M
            token.integer = negative ? -significand : significand;
985
6.30M
            json_parser_input(p, &token);
986
6.30M
            return;
987
6.30M
        }
988
6.34M
    }
989
990
59.1k
    token.type = T_REAL;
991
59.1k
    if (!str_to_double(ds_cstr(&p->buffer), &token.real)) {
992
72
        json_error(p, "number outside valid range");
993
72
        return;
994
72
    }
995
    /* Suppress negative zero. */
996
59.0k
    if (token.real == 0) {
997
263
        token.real = 0;
998
263
    }
999
59.0k
    json_parser_input(p, &token);
1000
59.0k
    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.77k
{
1009
3.77k
    unsigned int value;
1010
3.77k
    bool ok;
1011
1012
3.77k
    if (cp + 4 > end) {
1013
4
        return "quoted string ends within \\u escape";
1014
4
    }
1015
1016
3.77k
    value = hexits_value(cp, 4, &ok);
1017
3.77k
    if (!ok) {
1018
21
        return "malformed \\u escape";
1019
21
    }
1020
3.75k
    if (!value) {
1021
4
        return "null bytes not supported in quoted strings";
1022
4
    }
1023
3.74k
    *valuep = value;
1024
3.74k
    return NULL;
1025
3.75k
}
1026
1027
static const char *
1028
json_lex_unicode(const char *cp, const char *end, struct ds *out)
1029
2.93k
{
1030
2.93k
    const char *error;
1031
2.93k
    int c0, c1;
1032
1033
2.93k
    error = json_lex_4hex(cp, end, &c0);
1034
2.93k
    if (error) {
1035
24
        ds_clear(out);
1036
24
        ds_put_cstr(out, error);
1037
24
        return NULL;
1038
24
    }
1039
2.90k
    cp += 4;
1040
2.90k
    if (!uc_is_leading_surrogate(c0)) {
1041
2.02k
        ds_put_utf8(out, c0);
1042
2.02k
        return cp;
1043
2.02k
    }
1044
1045
880
    if (cp + 2 > end || *cp++ != '\\' || *cp++ != 'u') {
1046
33
        ds_clear(out);
1047
33
        ds_put_cstr(out, "malformed escaped surrogate pair");
1048
33
        return NULL;
1049
33
    }
1050
1051
847
    error = json_lex_4hex(cp, end, &c1);
1052
847
    if (error) {
1053
5
        ds_clear(out);
1054
5
        ds_put_cstr(out, error);
1055
5
        return NULL;
1056
5
    }
1057
842
    cp += 4;
1058
842
    if (!uc_is_trailing_surrogate(c1)) {
1059
29
        ds_clear(out);
1060
29
        ds_put_cstr(out, "second half of escaped surrogate pair is not "
1061
29
                    "trailing surrogate");
1062
29
        return NULL;
1063
29
    }
1064
1065
813
    ds_put_utf8(out, utf16_decode_surrogate_pair(c0, c1));
1066
813
    return cp;
1067
842
}
1068
1069
bool
1070
json_string_unescape(const char *in, size_t in_len, char **outp)
1071
14.2k
{
1072
14.2k
    const char *end = in + in_len;
1073
14.2k
    bool ok = false;
1074
14.2k
    struct ds out;
1075
1076
14.2k
    ds_init(&out);
1077
14.2k
    ds_reserve(&out, in_len);
1078
21.7M
    while (in < end) {
1079
21.7M
        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
21.7M
        if (*in != '\\') {
1085
21.4M
            ds_put_char(&out, *in++);
1086
21.4M
            continue;
1087
21.4M
        }
1088
1089
353k
        in++;
1090
353k
        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
353k
        switch (*in++) {
1100
314k
        case '"': case '\\': case '/':
1101
314k
            ds_put_char(&out, in[-1]);
1102
314k
            break;
1103
1104
14.3k
        case 'b':
1105
14.3k
            ds_put_char(&out, '\b');
1106
14.3k
            break;
1107
1108
13.2k
        case 'f':
1109
13.2k
            ds_put_char(&out, '\f');
1110
13.2k
            break;
1111
1112
3.33k
        case 'n':
1113
3.33k
            ds_put_char(&out, '\n');
1114
3.33k
            break;
1115
1116
2.86k
        case 'r':
1117
2.86k
            ds_put_char(&out, '\r');
1118
2.86k
            break;
1119
1120
1.75k
        case 't':
1121
1.75k
            ds_put_char(&out, '\t');
1122
1.75k
            break;
1123
1124
2.93k
        case 'u':
1125
2.93k
            in = json_lex_unicode(in, end, &out);
1126
2.93k
            if (!in) {
1127
91
                goto exit;
1128
91
            }
1129
2.83k
            break;
1130
1131
2.83k
        default:
1132
20
            ds_clear(&out);
1133
20
            ds_put_format(&out, "bad escape \\%c", in[-1]);
1134
20
            goto exit;
1135
353k
        }
1136
353k
    }
1137
14.1k
    ok = true;
1138
1139
14.2k
exit:
1140
14.2k
    *outp = ds_cstr(&out);
1141
14.2k
    return ok;
1142
14.1k
}
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.4k
{
1158
50.4k
    struct json_token token;
1159
1160
50.4k
    token.type = T_STRING;
1161
50.4k
    token.string = s;
1162
50.4k
    json_parser_input(p, &token);
1163
50.4k
}
1164
1165
static void
1166
json_lex_string(struct json_parser *p)
1167
50.5k
{
1168
50.5k
    const char *raw = ds_cstr(&p->buffer);
1169
50.5k
    if (!strchr(raw, '\\')) {
1170
36.2k
        json_parser_input_string(p, raw);
1171
36.2k
    } else {
1172
14.2k
        char *cooked;
1173
1174
14.2k
        if (json_string_unescape(raw, strlen(raw), &cooked)) {
1175
14.1k
            json_parser_input_string(p, cooked);
1176
14.1k
        } else {
1177
111
            json_error(p, "%s", cooked);
1178
111
        }
1179
1180
14.2k
        free(cooked);
1181
14.2k
    }
1182
50.5k
}
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.14k
{
1204
4.14k
    struct json_parser *p = json_parser_create(JSPF_TRAILER);
1205
4.14k
    json_parser_feed(p, string, strlen(string));
1206
4.14k
    return json_parser_finish(p);
1207
4.14k
}
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.14k
{
1280
4.14k
    struct json_parser *p = xzalloc(sizeof *p);
1281
4.14k
    p->flags = flags;
1282
4.14k
    return p;
1283
4.14k
}
1284
1285
static inline void ALWAYS_INLINE
1286
json_parser_account_byte(struct json_parser *p, unsigned char c)
1287
67.8M
{
1288
67.8M
    p->byte_number++;
1289
67.8M
    if (OVS_UNLIKELY(c == '\n')) {
1290
211
        p->column_number = 0;
1291
211
        p->line_number++;
1292
67.8M
    } else {
1293
67.8M
        p->column_number++;
1294
67.8M
    }
1295
67.8M
}
1296
1297
size_t
1298
json_parser_feed(struct json_parser *p, const char *input, size_t n)
1299
5.62k
{
1300
5.62k
    size_t token_start = 0;
1301
5.62k
    size_t i;
1302
1303
83.6M
    for (i = 0; !p->done && i < n; ) {
1304
83.6M
        bool consumed = true;
1305
1306
83.6M
        const char *start_p = &input[token_start];
1307
83.6M
        unsigned char c = input[i];
1308
83.6M
        struct json_token token;
1309
1310
83.6M
        switch (p->lex_state) {
1311
35.8M
        case JSON_LEX_START:
1312
35.8M
            switch (c) {
1313
4.60k
            case ' ': case '\t': case '\n': case '\r':
1314
                /* Nothing to do. */
1315
4.60k
                token_start = i + 1;
1316
4.60k
                break;
1317
1318
5
            case 'a': case 'b': case 'c': case 'd': case 'e':
1319
1.52k
            case 'f': case 'g': case 'h': case 'i': case 'j':
1320
54.4k
            case 'k': case 'l': case 'm': case 'n': case 'o':
1321
57.1k
            case 'p': case 'q': case 'r': case 's': case 't':
1322
57.1k
            case 'u': case 'v': case 'w': case 'x': case 'y':
1323
57.1k
            case 'z':
1324
57.1k
                p->lex_state = JSON_LEX_KEYWORD;
1325
57.1k
                token_start = i;
1326
57.1k
                break;
1327
1328
20.0M
            case '[': case '{': case ']': case '}': case ':': case ',':
1329
20.0M
                token.type = c;
1330
20.0M
                json_parser_input(p, &token);
1331
20.0M
                token_start = i + 1;
1332
20.0M
                break;
1333
1334
26.2k
            case '-':
1335
14.6M
            case '0': case '1': case '2': case '3': case '4':
1336
15.7M
            case '5': case '6': case '7': case '8': case '9':
1337
15.7M
                p->lex_state = JSON_LEX_NUMBER;
1338
15.7M
                token_start = i;
1339
15.7M
                break;
1340
1341
50.5k
            case '"':
1342
50.5k
                p->lex_state = JSON_LEX_STRING;
1343
50.5k
                token_start = i + 1;
1344
50.5k
                break;
1345
1346
14
            default:
1347
14
                if (isprint(c)) {
1348
6
                    json_error(p, "invalid character '%c'", c);
1349
8
                } else {
1350
8
                    json_error(p, "invalid character U+%04x", c);
1351
8
                }
1352
14
                break;
1353
35.8M
            }
1354
35.8M
            break;
1355
1356
35.8M
        case JSON_LEX_KEYWORD:
1357
230k
            if (!isalpha((unsigned char) c)) {
1358
57.1k
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1359
57.1k
                json_lex_keyword(p);
1360
57.1k
                consumed = false;
1361
57.1k
                break;
1362
57.1k
            }
1363
172k
            break;
1364
1365
19.1M
        case JSON_LEX_NUMBER:
1366
19.1M
            if (!strchr(".0123456789eE-+", c)) {
1367
15.7M
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1368
15.7M
                json_lex_number(p);
1369
15.7M
                consumed = false;
1370
15.7M
                break;
1371
15.7M
            }
1372
3.38M
            break;
1373
1374
28.0M
        case JSON_LEX_STRING:
1375
28.0M
            if (c == '\\') {
1376
378k
                p->lex_state = JSON_LEX_ESCAPE;
1377
27.6M
            } else if (c == '"') {
1378
50.5k
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1379
50.5k
                json_lex_string(p);
1380
27.5M
            } else if (c < 0x20) {
1381
11
                json_error(p, "U+%04X must be escaped in quoted string", c);
1382
11
            }
1383
28.0M
            break;
1384
1385
378k
        case JSON_LEX_ESCAPE:
1386
378k
            p->lex_state = JSON_LEX_STRING;
1387
378k
            break;
1388
1389
0
        default:
1390
0
            ovs_abort(0, "unexpected lexer state");
1391
83.6M
        }
1392
1393
83.6M
        if (consumed) {
1394
67.8M
            json_parser_account_byte(p, c);
1395
67.8M
            i++;
1396
67.8M
        }
1397
83.6M
    }
1398
1399
5.62k
    if (!p->done) {
1400
3.94k
        ds_put_buffer(&p->buffer, &input[token_start], i - token_start);
1401
3.94k
    }
1402
5.62k
    return i;
1403
5.62k
}
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.14k
{
1414
4.14k
    struct json *json;
1415
1416
4.14k
    switch (p->lex_state) {
1417
2.49k
    case JSON_LEX_START:
1418
2.49k
        break;
1419
1420
158
    case JSON_LEX_STRING:
1421
166
    case JSON_LEX_ESCAPE:
1422
166
        json_error(p, "unexpected end of input in quoted string");
1423
166
        break;
1424
1425
1.31k
    case JSON_LEX_NUMBER:
1426
1.48k
    case JSON_LEX_KEYWORD:
1427
1.48k
        json_parser_feed(p, " ", 1);
1428
1.48k
        break;
1429
4.14k
    }
1430
1431
4.14k
    if (p->parse_state == JSON_PARSE_START) {
1432
1.54k
        json_error(p, "empty input stream");
1433
2.60k
    } else if (p->parse_state != JSON_PARSE_END) {
1434
1.02k
        json_error(p, "unexpected end of input");
1435
1.02k
    }
1436
1437
4.14k
    if (!p->error) {
1438
1.55k
        ovs_assert(p->height == 1);
1439
1.55k
        ovs_assert(p->stack[0].json != NULL);
1440
1.55k
        json = p->stack[--p->height].json;
1441
2.59k
    } else {
1442
2.59k
        json = json_string_create_nocopy(p->error);
1443
2.59k
        p->error = NULL;
1444
2.59k
    }
1445
1446
4.14k
    json_parser_abort(p);
1447
1448
4.14k
    return json;
1449
4.14k
}
1450
1451
void
1452
json_parser_abort(struct json_parser *p)
1453
4.14k
{
1454
4.14k
    if (p) {
1455
4.14k
        ds_destroy(&p->buffer);
1456
4.14k
        if (p->height) {
1457
1.04k
            json_destroy(p->stack[0].json);
1458
1.04k
        }
1459
4.14k
        free(p->stack);
1460
4.14k
        free(p->member_name);
1461
4.14k
        free(p->error);
1462
4.14k
        free(p);
1463
4.14k
    }
1464
4.14k
}
1465
1466
static struct json_parser_node *
1467
json_parser_top(struct json_parser *p)
1468
20.2M
{
1469
20.2M
    return &p->stack[p->height - 1];
1470
20.2M
}
1471
1472
static void
1473
json_parser_put_value(struct json_parser *p, struct json *value)
1474
17.3M
{
1475
17.3M
    struct json_parser_node *node = json_parser_top(p);
1476
17.3M
    if (node->json->type == JSON_OBJECT) {
1477
32.7k
        json_object_put_nocopy(node->json, p->member_name, value);
1478
32.7k
        p->member_name = NULL;
1479
17.2M
    } else if (node->json->type == JSON_ARRAY) {
1480
17.2M
        json_array_add(node->json, value);
1481
17.2M
    } else {
1482
0
        OVS_NOT_REACHED();
1483
0
    }
1484
17.3M
}
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.51M
{
1490
1.51M
    if (p->height < JSON_MAX_HEIGHT) {
1491
1.51M
        struct json_parser_node *node;
1492
1493
1.51M
        if (p->height >= p->allocated_height) {
1494
9.64k
            p->stack = x2nrealloc(p->stack, &p->allocated_height,
1495
9.64k
                                  sizeof *p->stack);
1496
9.64k
        }
1497
1498
1.51M
        if (p->height > 0) {
1499
1.50M
            json_parser_put_value(p, new_json);
1500
1.50M
        }
1501
1502
1.51M
        node = &p->stack[p->height++];
1503
1.51M
        node->json = new_json;
1504
1.51M
        p->parse_state = new_state;
1505
1.51M
    } 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.51M
}
1511
1512
static void
1513
json_parser_push_object(struct json_parser *p)
1514
1.02M
{
1515
1.02M
    json_parser_push(p, json_object_create(), JSON_PARSE_OBJECT_INIT);
1516
1.02M
}
1517
1518
static void
1519
json_parser_push_array(struct json_parser *p)
1520
485k
{
1521
485k
    json_parser_push(p, json_array_create_empty(), JSON_PARSE_ARRAY_INIT);
1522
485k
}
1523
1524
static void
1525
json_parse_value(struct json_parser *p, struct json_token *token,
1526
                 enum json_parse_state next_state)
1527
17.3M
{
1528
17.3M
    struct json *value;
1529
1530
17.3M
    switch (token->type) {
1531
1.47k
    case T_FALSE:
1532
1.47k
        value = json_boolean_create(false);
1533
1.47k
        break;
1534
1535
52.9k
    case T_NULL:
1536
52.9k
        value = json_null_create();
1537
52.9k
        break;
1538
1539
2.63k
    case T_TRUE:
1540
2.63k
        value = json_boolean_create(true);
1541
2.63k
        break;
1542
1543
1.02M
    case '{':
1544
1.02M
        json_parser_push_object(p);
1545
1.02M
        return;
1546
1547
484k
    case '[':
1548
484k
        json_parser_push_array(p);
1549
484k
        return;
1550
1551
15.6M
    case T_INTEGER:
1552
15.6M
        value = json_integer_create(token->integer);
1553
15.6M
        break;
1554
1555
58.5k
    case T_REAL:
1556
58.5k
        value = json_real_create(token->real);
1557
58.5k
        break;
1558
1559
17.1k
    case T_STRING:
1560
17.1k
        value = json_string_create(token->string);
1561
17.1k
        break;
1562
1563
0
    case T_EOF:
1564
2
    case '}':
1565
2
    case ']':
1566
10
    case ':':
1567
18
    case ',':
1568
18
    default:
1569
18
        json_error(p, "syntax error expecting value");
1570
18
        return;
1571
17.3M
    }
1572
1573
15.8M
    json_parser_put_value(p, value);
1574
15.8M
    p->parse_state = next_state;
1575
15.8M
}
1576
1577
static void
1578
json_parser_pop(struct json_parser *p)
1579
1.47M
{
1580
1.47M
    struct json_parser_node *node;
1581
1582
    /* Conserve memory. */
1583
1.47M
    node = json_parser_top(p);
1584
1.47M
    if (node->json->type == JSON_ARRAY) {
1585
456k
        json_array_trim(node->json);
1586
456k
    }
1587
1588
    /* Pop off the top-of-stack. */
1589
1.47M
    if (p->height == 1) {
1590
1.57k
        p->parse_state = JSON_PARSE_END;
1591
1.57k
        if (!(p->flags & JSPF_TRAILER)) {
1592
0
            p->done = true;
1593
0
        }
1594
1.47M
    } else {
1595
1.47M
        p->height--;
1596
1.47M
        node = json_parser_top(p);
1597
1.47M
        if (node->json->type == JSON_ARRAY) {
1598
1.47M
            p->parse_state = JSON_PARSE_ARRAY_NEXT;
1599
1.47M
        } else if (node->json->type == JSON_OBJECT) {
1600
6.69k
            p->parse_state = JSON_PARSE_OBJECT_NEXT;
1601
6.69k
        } else {
1602
0
            OVS_NOT_REACHED();
1603
0
        }
1604
1.47M
    }
1605
1.47M
}
1606
1607
static void
1608
json_parser_input(struct json_parser *p, struct json_token *token)
1609
35.8M
{
1610
35.8M
    switch (p->parse_state) {
1611
3.74k
    case JSON_PARSE_START:
1612
3.74k
        if (token->type == '{') {
1613
1.21k
            json_parser_push_object(p);
1614
2.53k
        } else if (token->type == '[') {
1615
1.39k
            json_parser_push_array(p);
1616
1.39k
        } else {
1617
1.14k
            json_error(p, "syntax error at beginning of input");
1618
1.14k
        }
1619
3.74k
        break;
1620
1621
20
    case JSON_PARSE_END:
1622
20
        json_error(p, "trailing garbage at end of input");
1623
20
        break;
1624
1625
1.02M
    case JSON_PARSE_OBJECT_INIT:
1626
1.02M
        if (token->type == '}') {
1627
1.01M
            json_parser_pop(p);
1628
1.01M
            break;
1629
1.01M
        }
1630
        /* Fall through. */
1631
32.8k
    case JSON_PARSE_OBJECT_NAME:
1632
32.8k
        if (token->type == T_STRING) {
1633
32.8k
            p->member_name = xstrdup(token->string);
1634
32.8k
            p->parse_state = JSON_PARSE_OBJECT_COLON;
1635
32.8k
        } else {
1636
26
            json_error(p, "syntax error parsing object expecting string");
1637
26
        }
1638
32.8k
        break;
1639
1640
32.8k
    case JSON_PARSE_OBJECT_COLON:
1641
32.8k
        if (token->type == ':') {
1642
32.7k
            p->parse_state = JSON_PARSE_OBJECT_VALUE;
1643
32.7k
        } else {
1644
17
            json_error(p, "syntax error parsing object expecting ':'");
1645
17
        }
1646
32.8k
        break;
1647
1648
32.7k
    case JSON_PARSE_OBJECT_VALUE:
1649
32.7k
        json_parse_value(p, token, JSON_PARSE_OBJECT_NEXT);
1650
32.7k
        break;
1651
1652
29.3k
    case JSON_PARSE_OBJECT_NEXT:
1653
29.3k
        if (token->type == ',') {
1654
22.0k
            p->parse_state = JSON_PARSE_OBJECT_NAME;
1655
22.0k
        } else if (token->type == '}') {
1656
7.26k
            json_parser_pop(p);
1657
7.26k
        } else {
1658
11
            json_error(p, "syntax error expecting '}' or ','");
1659
11
        }
1660
29.3k
        break;
1661
1662
485k
    case JSON_PARSE_ARRAY_INIT:
1663
485k
        if (token->type == ']') {
1664
161k
            json_parser_pop(p);
1665
161k
            break;
1666
161k
        }
1667
        /* Fall through. */
1668
17.2M
    case JSON_PARSE_ARRAY_VALUE:
1669
17.2M
        json_parse_value(p, token, JSON_PARSE_ARRAY_NEXT);
1670
17.2M
        break;
1671
1672
17.2M
    case JSON_PARSE_ARRAY_NEXT:
1673
17.2M
        if (token->type == ',') {
1674
16.9M
            p->parse_state = JSON_PARSE_ARRAY_VALUE;
1675
16.9M
        } else if (token->type == ']') {
1676
295k
            json_parser_pop(p);
1677
295k
        } else {
1678
30
            json_error(p, "syntax error expecting ']' or ','");
1679
30
        }
1680
17.2M
        break;
1681
1682
0
    default:
1683
0
        abort();
1684
35.8M
    }
1685
1686
35.8M
    p->lex_state = JSON_LEX_START;
1687
35.8M
    ds_clear(&p->buffer);
1688
35.8M
}
1689
1690
static struct json *
1691
json_create(enum json_type type)
1692
17.3M
{
1693
17.3M
    struct json *json = xmalloc(sizeof *json);
1694
17.3M
    json->type = type;
1695
17.3M
    json->count = 1;
1696
17.3M
    return json;
1697
17.3M
}
1698
1699
static void
1700
json_error(struct json_parser *p, const char *format, ...)
1701
4.41k
{
1702
4.41k
    if (!p->error) {
1703
2.59k
        struct ds msg;
1704
2.59k
        va_list args;
1705
1706
2.59k
        ds_init(&msg);
1707
2.59k
        ds_put_format(&msg, "line %d, column %d, byte %d: ",
1708
2.59k
                      p->line_number, p->column_number, p->byte_number);
1709
2.59k
        va_start(args, format);
1710
2.59k
        ds_put_format_valist(&msg, format, args);
1711
2.59k
        va_end(args);
1712
1713
2.59k
        p->error = ds_steal_cstr(&msg);
1714
1715
2.59k
        p->done = true;
1716
2.59k
    }
1717
4.41k
}
1718

1719
19.0M
#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.80k
{
1751
1.80k
    struct ds ds;
1752
1753
1.80k
    ds_init(&ds);
1754
1.80k
    json_to_ds(json, flags, &ds);
1755
1.80k
    return ds_steal_cstr(&ds);
1756
1.80k
}
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.80k
{
1762
1.80k
    struct json_serializer s;
1763
1764
1.80k
    s.ds = ds;
1765
1.80k
    s.depth = 0;
1766
1.80k
    s.flags = flags;
1767
1.80k
    json_serialize(json, &s);
1768
1.80k
}
1769
1770
static void
1771
json_serialize(const struct json *json, struct json_serializer *s)
1772
18.0M
{
1773
18.0M
    struct ds *ds = s->ds;
1774
1775
18.0M
    switch (json->type) {
1776
52.8k
    case JSON_NULL:
1777
52.8k
        ds_put_cstr(ds, "null");
1778
52.8k
        break;
1779
1780
1.24k
    case JSON_FALSE:
1781
1.24k
        ds_put_cstr(ds, "false");
1782
1.24k
        break;
1783
1784
2.37k
    case JSON_TRUE:
1785
2.37k
        ds_put_cstr(ds, "true");
1786
2.37k
        break;
1787
1788
1.02M
    case JSON_OBJECT:
1789
1.02M
        json_serialize_object(json->object, s);
1790
1.02M
        break;
1791
1792
611k
    case JSON_ARRAY:
1793
611k
        json_serialize_array(json, s);
1794
611k
        break;
1795
1796
16.3M
    case JSON_INTEGER:
1797
16.3M
        ds_put_format(ds, "%lld", json->integer);
1798
16.3M
        break;
1799
1800
61.6k
    case JSON_REAL:
1801
61.6k
        ds_put_format(ds, "%.*g", DBL_DIG, json->real);
1802
61.6k
        break;
1803
1804
16.0k
    case JSON_STRING:
1805
16.0k
        json_serialize_string(json_string(json), ds);
1806
16.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.0M
    }
1816
18.0M
}
1817
1818
static void
1819
indent_line(struct json_serializer *s)
1820
19.0M
{
1821
19.0M
    if (s->flags & JSSF_PRETTY) {
1822
19.0M
        ds_put_char(s->ds, '\n');
1823
19.0M
        ds_put_char_multiple(s->ds, ' ', SPACES_PER_LEVEL * s->depth);
1824
19.0M
    }
1825
19.0M
}
1826
1827
static void
1828
json_serialize_object_member(size_t i, const struct shash_node *node,
1829
                             struct json_serializer *s)
1830
28.0k
{
1831
28.0k
    struct ds *ds = s->ds;
1832
1833
28.0k
    if (i) {
1834
17.7k
        ds_put_char(ds, ',');
1835
17.7k
        indent_line(s);
1836
17.7k
    }
1837
1838
28.0k
    json_serialize_string(node->name, ds);
1839
28.0k
    ds_put_char(ds, ':');
1840
28.0k
    if (s->flags & JSSF_PRETTY) {
1841
28.0k
        ds_put_char(ds, ' ');
1842
28.0k
    }
1843
28.0k
    json_serialize(node->data, s);
1844
28.0k
}
1845
1846
static void
1847
json_serialize_object(const struct shash *object, struct json_serializer *s)
1848
1.02M
{
1849
1.02M
    struct ds *ds = s->ds;
1850
1851
1.02M
    ds_put_char(ds, '{');
1852
1853
1.02M
    s->depth++;
1854
1.02M
    indent_line(s);
1855
1856
1.02M
    if (s->flags & JSSF_YIELD) {
1857
0
        cooperative_multitasking_yield();
1858
0
    }
1859
1860
1.02M
    if (s->flags & JSSF_SORT) {
1861
1.02M
        const struct shash_node **nodes;
1862
1.02M
        size_t n, i;
1863
1864
1.02M
        nodes = shash_sort(object);
1865
1.02M
        n = shash_count(object);
1866
1.05M
        for (i = 0; i < n; i++) {
1867
28.0k
            json_serialize_object_member(i, nodes[i], s);
1868
28.0k
        }
1869
1.02M
        free(nodes);
1870
1.02M
    } 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
1.02M
    ds_put_char(ds, '}');
1881
1.02M
    s->depth--;
1882
1.02M
}
1883
1884
static void
1885
json_serialize_array(const struct json *json, struct json_serializer *s)
1886
611k
{
1887
611k
    size_t i, n = json_array_size(json);
1888
611k
    struct ds *ds = s->ds;
1889
1890
611k
    ds_put_char(ds, '[');
1891
611k
    s->depth++;
1892
1893
611k
    if (s->flags & JSSF_YIELD) {
1894
0
        cooperative_multitasking_yield();
1895
0
    }
1896
1897
611k
    if (n > 0) {
1898
303k
        indent_line(s);
1899
1900
18.3M
        for (i = 0; i < n; i++) {
1901
18.0M
            if (i) {
1902
17.7M
                ds_put_char(ds, ',');
1903
17.7M
                indent_line(s);
1904
17.7M
            }
1905
18.0M
            json_serialize(json_array_at(json, i), s);
1906
18.0M
        }
1907
303k
    }
1908
1909
611k
    s->depth--;
1910
611k
    ds_put_char(ds, ']');
1911
611k
}
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
44.1k
{
1951
44.1k
    uint8_t c;
1952
44.1k
    uint8_t c2;
1953
44.1k
    size_t count;
1954
44.1k
    const char *escape;
1955
44.1k
    const char *start;
1956
1957
44.1k
    ds_put_char(ds, '"');
1958
44.1k
    count = 0;
1959
44.1k
    start = string;
1960
14.3M
    while ((c = *string++) != '\0') {
1961
14.2M
        if (c >= ' ' && c != '"' && c != '\\') {
1962
13.6M
            count++;
1963
13.6M
        } else {
1964
641k
            if (count) {
1965
3.51k
                ds_put_buffer(ds, start, count);
1966
3.51k
                count = 0;
1967
3.51k
            }
1968
641k
            start = string;
1969
641k
            escape = chars_escaping[c];
1970
1.92M
            while ((c2 = *escape++) != '\0') {
1971
1.28M
                ds_put_char(ds, c2);
1972
1.28M
            }
1973
641k
        }
1974
14.2M
    }
1975
44.1k
    if (count) {
1976
37.7k
        ds_put_buffer(ds, start, count);
1977
37.7k
    }
1978
44.1k
    ds_put_char(ds, '"');
1979
44.1k
}