Coverage Report

Created: 2025-12-14 06:36

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.27M
#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
56.0k
{
169
56.0k
    return json_create(JSON_NULL);
170
56.0k
}
171
172
struct json *
173
json_boolean_create(bool b)
174
3.48k
{
175
3.48k
    return json_create(b ? JSON_TRUE : JSON_FALSE);
176
3.48k
}
177
178
struct json *
179
json_string_create_nocopy(char *s)
180
2.59k
{
181
2.59k
    struct json *json = json_create(JSON_STRING);
182
2.59k
    json->storage_type = JSON_STRING_DYNAMIC;
183
2.59k
    json->str_ptr = s;
184
2.59k
    return json;
185
2.59k
}
186
187
struct json *
188
json_string_create(const char *s)
189
14.4k
{
190
14.4k
    struct json *json = json_create(JSON_STRING);
191
14.4k
    size_t length = strlen(s);
192
193
14.4k
    if (length <= JSON_STRING_INLINE_LEN) {
194
13.8k
        json->storage_type = JSON_STRING_INLINE;
195
13.8k
        memcpy(json->str, s, length);
196
13.8k
        json->str[length] = '\0';
197
13.8k
    } else {
198
585
        json->storage_type = JSON_STRING_DYNAMIC;
199
585
        json->str_ptr = xmemdup0(s, length);
200
585
    }
201
14.4k
    return json;
202
14.4k
}
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
460k
{
228
460k
    struct json *json = json_create(JSON_ARRAY);
229
460k
    json->storage_type = JSON_ARRAY_DYNAMIC;
230
460k
    json->array.elements = NULL;
231
460k
    json->array.size = 0;
232
460k
    json->array.allocated = 0;
233
460k
    return json;
234
460k
}
235
236
void
237
json_array_add(struct json *array_, struct json *element)
238
20.2M
{
239
20.2M
    switch (array_->storage_type) {
240
20.1M
    case JSON_ARRAY_DYNAMIC:
241
20.1M
        if (!array_->array.size) {
242
316k
            array_->storage_type = JSON_ARRAY_INLINE_1;
243
316k
            array_->elements[0] = element;
244
316k
            return;
245
316k
        }
246
19.8M
        break;
247
248
19.8M
    case JSON_ARRAY_INLINE_1:
249
37.2k
    case JSON_ARRAY_INLINE_2:
250
37.2k
        array_->elements[array_->storage_type - JSON_ARRAY_DYNAMIC] = element;
251
37.2k
        array_->storage_type++;
252
37.2k
        return;
253
254
8.48k
    case JSON_ARRAY_INLINE_3: {
255
8.48k
        struct json **elements = xmalloc(4 * sizeof *elements);
256
257
8.48k
        memcpy(elements, array_->elements, 3 * sizeof array_->elements[0]);
258
8.48k
        array_->array.elements = elements;
259
8.48k
        array_->array.elements[3] = element;
260
8.48k
        array_->array.size = 4;
261
8.48k
        array_->array.allocated = 4;
262
8.48k
        array_->storage_type = JSON_ARRAY_DYNAMIC;
263
8.48k
        return;
264
26.1k
    }
265
266
0
    case JSON_STRING_DYNAMIC:
267
0
    case JSON_STRING_INLINE:
268
0
    default:
269
0
        OVS_NOT_REACHED();
270
20.2M
    }
271
272
19.8M
    struct json_array *array = &array_->array;
273
19.8M
    if (array->size >= array->allocated) {
274
22.6k
        array->elements = x2nrealloc(array->elements, &array->allocated,
275
22.6k
                                     sizeof *array->elements);
276
22.6k
    }
277
19.8M
    array->elements[array->size++] = element;
278
19.8M
}
279
280
void
281
json_array_set(struct json *json, size_t index, struct json *element)
282
0
{
283
0
    ovs_assert(json_array_size(json) > index);
284
0
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
285
0
        json->array.elements[index] = element;
286
0
    } else {
287
0
        json->elements[index] = element;
288
0
    }
289
0
}
290
291
struct json *
292
json_array_pop(struct json *json)
293
0
{
294
0
    if (!json_array_size(json)) {
295
0
        return NULL;
296
0
    }
297
0
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
298
0
        return json->array.elements[--json->array.size];
299
0
    }
300
0
    if (json->storage_type > JSON_ARRAY_INLINE_1) {
301
0
        return json->elements[--json->storage_type - JSON_ARRAY_DYNAMIC];
302
0
    }
303
304
    /* Need to fall back to an empty array in case it's the last
305
     * inline element. */
306
0
    struct json *element = json->elements[0];
307
0
    json->storage_type = JSON_ARRAY_DYNAMIC;
308
0
    json->array.elements = NULL;
309
0
    json->array.size = 0;
310
0
    json->array.allocated = 0;
311
0
    return element;
312
0
}
313
314
void
315
json_array_trim(struct json *array_)
316
432k
{
317
432k
    if (array_->storage_type != JSON_ARRAY_DYNAMIC) {
318
281k
        return;
319
281k
    }
320
321
150k
    struct json_array *array = &array_->array;
322
150k
    if (array->size < array->allocated) {
323
6.53k
        array->allocated = array->size;
324
6.53k
        array->elements = xrealloc(array->elements,
325
6.53k
                                   array->size * sizeof *array->elements);
326
6.53k
    }
327
150k
}
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
815k
{
394
815k
    struct json *json = json_create(JSON_OBJECT);
395
815k
    json->object = xmalloc(sizeof *json->object);
396
815k
    shash_init(json->object);
397
815k
    return json;
398
815k
}
399
400
struct json *
401
json_integer_create(long long int integer)
402
18.8M
{
403
18.8M
    struct json *json = json_create(JSON_INTEGER);
404
18.8M
    json->integer = integer;
405
18.8M
    return json;
406
18.8M
}
407
408
struct json *
409
json_real_create(double real)
410
68.7k
{
411
68.7k
    struct json *json = json_create(JSON_REAL);
412
68.7k
    json->real = real;
413
68.7k
    return json;
414
68.7k
}
415
416
void
417
json_object_put(struct json *json, const char *name, struct json *value)
418
732
{
419
732
    json_destroy(shash_replace(json->object, name, value));
420
732
}
421
422
void
423
json_object_put_nocopy(struct json *json, char *name, struct json *value)
424
32.0k
{
425
32.0k
    json_destroy(shash_replace_nocopy(json->object, name, value));
426
32.0k
}
427
428
void
429
json_object_put_string(struct json *json, const char *name, const char *value)
430
0
{
431
0
    json_object_put(json, name, json_string_create(value));
432
0
}
433
434
void OVS_PRINTF_FORMAT(3, 4)
435
json_object_put_format(struct json *json,
436
                       const char *name, const char *format, ...)
437
0
{
438
0
    va_list args;
439
0
    va_start(args, format);
440
0
    json_object_put(json, name,
441
0
                    json_string_create_nocopy(xvasprintf(format, args)));
442
0
    va_end(args);
443
0
}
444
445
void json_object_put_uuid(struct json *json,
446
                          const char *name, const struct uuid *uuid)
447
0
{
448
0
    json_object_put(json, name, json_string_create_uuid(uuid));
449
0
}
450
451
const char *
452
json_string(const struct json *json)
453
13.5k
{
454
13.5k
    ovs_assert(json->type == JSON_STRING);
455
13.5k
    return json->storage_type == JSON_STRING_DYNAMIC
456
13.5k
           ? json->str_ptr : json->str;
457
13.5k
}
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.03M
{
469
1.03M
    ovs_assert(json->type == JSON_ARRAY);
470
1.03M
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
471
438k
        return json->array.size;
472
438k
    }
473
597k
    return json->storage_type - JSON_ARRAY_DYNAMIC;
474
1.03M
}
475
476
const struct json *
477
json_array_at(const struct json *json, size_t index)
478
41.1M
{
479
41.1M
    ovs_assert(json->type == JSON_ARRAY);
480
481
41.1M
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
482
40.5M
        if (json->array.size <= index) {
483
0
            return NULL;
484
0
        }
485
40.5M
        return json->array.elements[index];
486
40.5M
    }
487
488
637k
    if (json->storage_type - JSON_ARRAY_DYNAMIC <= index) {
489
0
        return NULL;
490
0
    }
491
637k
    return json->elements[index];
492
637k
}
493
494
struct shash *
495
json_object(const struct json *json)
496
704
{
497
704
    ovs_assert(json->type == JSON_OBJECT);
498
704
    return CONST_CAST(struct shash *, json->object);
499
704
}
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
20.2M
{
529
20.2M
    switch (json->type) {
530
815k
    case JSON_OBJECT:
531
815k
        json_destroy_object(json->object, yield);
532
815k
        break;
533
534
460k
    case JSON_ARRAY:
535
460k
        json_destroy_array(json, yield);
536
460k
        break;
537
538
17.0k
    case JSON_STRING:
539
17.0k
        if (json->storage_type == JSON_STRING_DYNAMIC) {
540
3.18k
            free(json->str_ptr);
541
3.18k
        }
542
17.0k
        break;
543
544
0
    case JSON_SERIALIZED_OBJECT:
545
0
        free(json->str_ptr);
546
0
        break;
547
548
56.0k
    case JSON_NULL:
549
57.6k
    case JSON_FALSE:
550
59.5k
    case JSON_TRUE:
551
18.9M
    case JSON_INTEGER:
552
18.9M
    case JSON_REAL:
553
18.9M
        break;
554
555
0
    case JSON_N_TYPES:
556
0
        OVS_NOT_REACHED();
557
20.2M
    }
558
20.2M
    free(json);
559
20.2M
}
560
561
static void
562
json_destroy_object(struct shash *object, bool yield)
563
815k
{
564
815k
    struct shash_node *node;
565
566
815k
    if (yield) {
567
0
        cooperative_multitasking_yield();
568
0
    }
569
570
815k
    SHASH_FOR_EACH_SAFE (node, object) {
571
30.2k
        struct json *value = node->data;
572
573
30.2k
        if (yield) {
574
0
            json_destroy_with_yield(value);
575
30.2k
        } else {
576
30.2k
            json_destroy(value);
577
30.2k
        }
578
30.2k
        shash_delete(object, node);
579
30.2k
    }
580
815k
    shash_destroy(object);
581
815k
    free(object);
582
815k
}
583
584
static void
585
json_destroy_array(struct json *json, bool yield)
586
460k
{
587
460k
    size_t i, n = json_array_size(json);
588
589
460k
    if (yield) {
590
0
        cooperative_multitasking_yield();
591
0
    }
592
593
20.6M
    for (i = 0; i < n; i++) {
594
20.2M
        if (yield) {
595
0
            json_destroy_with_yield(
596
0
                CONST_CAST(struct json *, json_array_at(json, i)));
597
20.2M
        } else {
598
20.2M
            json_destroy(CONST_CAST(struct json *, json_array_at(json, i)));
599
20.2M
        }
600
20.2M
    }
601
460k
    if (json->storage_type == JSON_ARRAY_DYNAMIC) {
602
151k
        free(json->array.elements);
603
151k
    }
604
460k
}
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
59.4k
{
838
59.4k
    struct json_token token;
839
59.4k
    const char *s;
840
841
59.4k
    s = ds_cstr(&p->buffer);
842
59.4k
    if (!strcmp(s, "false")) {
843
1.56k
        token.type = T_FALSE;
844
57.8k
    } else if (!strcmp(s, "true")) {
845
1.92k
        token.type = T_TRUE;
846
55.9k
    } else if (!strcmp(s, "null")) {
847
55.8k
        token.type = T_NULL;
848
55.8k
    } else {
849
156
        json_error(p, "invalid keyword '%s'", s);
850
156
        return;
851
156
    }
852
59.2k
    json_parser_input(p, &token);
853
59.2k
}
854
855
static void
856
json_lex_number(struct json_parser *p)
857
18.9M
{
858
18.9M
    const char *cp = ds_cstr(&p->buffer);
859
18.9M
    unsigned long long int significand = 0;
860
18.9M
    struct json_token token;
861
18.9M
    bool imprecise = false;
862
18.9M
    bool negative = false;
863
18.9M
    int pow10 = 0;
864
865
    /* Leading minus sign. */
866
18.9M
    if (*cp == '-') {
867
27.5k
        negative = true;
868
27.5k
        cp++;
869
27.5k
    }
870
871
    /* At least one integer digit, but 0 may not be used as a leading digit for
872
     * a longer number. */
873
18.9M
    significand = 0;
874
18.9M
    if (*cp == '0') {
875
11.5M
        cp++;
876
11.5M
        if (isdigit((unsigned char) *cp)) {
877
2
            json_error(p, "leading zeros not allowed");
878
2
            return;
879
2
        }
880
11.5M
    } else if (isdigit((unsigned char) *cp)) {
881
11.0M
        do {
882
11.0M
            if (significand <= ULLONG_MAX / 10) {
883
9.94M
                significand = significand * 10 + (*cp - '0');
884
9.94M
            } else {
885
1.12M
                pow10++;
886
1.12M
                if (*cp != '0') {
887
89.9k
                    imprecise = true;
888
89.9k
                }
889
1.12M
            }
890
11.0M
            cp++;
891
11.0M
        } while (isdigit((unsigned char) *cp));
892
7.37M
    } else {
893
10
        json_error(p, "'-' must be followed by digit");
894
10
        return;
895
10
    }
896
897
    /* Optional fraction. */
898
18.9M
    if (*cp == '.') {
899
40.9k
        cp++;
900
40.9k
        if (!isdigit((unsigned char) *cp)) {
901
3
            json_error(p, "decimal point must be followed by digit");
902
3
            return;
903
3
        }
904
54.7k
        do {
905
54.7k
            if (significand <= ULLONG_MAX / 10) {
906
53.4k
                significand = significand * 10 + (*cp - '0');
907
53.4k
                pow10--;
908
53.4k
            } else if (*cp != '0') {
909
942
                imprecise = true;
910
942
            }
911
54.7k
            cp++;
912
54.7k
        } while (isdigit((unsigned char) *cp));
913
40.9k
    }
914
915
    /* Optional exponent. */
916
18.9M
    if (*cp == 'e' || *cp == 'E') {
917
5.45k
        bool negative_exponent = false;
918
5.45k
        int exponent;
919
920
5.45k
        cp++;
921
5.45k
        if (*cp == '+') {
922
2.22k
            cp++;
923
3.22k
        } else if (*cp == '-') {
924
766
            negative_exponent = true;
925
766
            cp++;
926
766
        }
927
928
5.45k
        if (!isdigit((unsigned char) *cp)) {
929
31
            json_error(p, "exponent must contain at least one digit");
930
31
            return;
931
31
        }
932
933
5.42k
        exponent = 0;
934
10.6k
        do {
935
10.6k
            if (exponent >= INT_MAX / 10) {
936
5
                goto bad_exponent;
937
5
            }
938
10.6k
            exponent = exponent * 10 + (*cp - '0');
939
10.6k
            cp++;
940
10.6k
        } while (isdigit((unsigned char) *cp));
941
942
5.41k
        if (negative_exponent) {
943
760
            if (pow10 < INT_MIN + exponent) {
944
1
                goto bad_exponent;
945
1
            }
946
759
            pow10 -= exponent;
947
4.65k
        } else {
948
4.65k
            if (pow10 > INT_MAX - exponent) {
949
21
                goto bad_exponent;
950
21
            }
951
4.63k
            pow10 += exponent;
952
4.63k
        }
953
5.41k
    }
954
955
18.9M
    if (*cp != '\0') {
956
3
        json_error(p, "syntax error in number");
957
3
        return;
958
3
    }
959
960
    /* Figure out number.
961
     *
962
     * We suppress negative zeros as a matter of policy. */
963
18.9M
    if (!significand) {
964
11.5M
        token.type = T_INTEGER;
965
11.5M
        token.integer = 0;
966
11.5M
        json_parser_input(p, &token);
967
11.5M
        return;
968
11.5M
    }
969
970
7.37M
    if (!imprecise) {
971
7.39M
        while (pow10 > 0 && significand < ULLONG_MAX / 10) {
972
54.2k
            significand *= 10;
973
54.2k
            pow10--;
974
54.2k
        }
975
7.34M
        while (pow10 < 0 && significand % 10 == 0) {
976
7.99k
            significand /= 10;
977
7.99k
            pow10++;
978
7.99k
        }
979
7.34M
        if (pow10 == 0
980
7.31M
            && significand <= (negative
981
7.31M
                               ? (unsigned long long int) LLONG_MAX + 1
982
7.31M
                               : LLONG_MAX)) {
983
7.30M
            token.type = T_INTEGER;
984
7.30M
            token.integer = negative ? -significand : significand;
985
7.30M
            json_parser_input(p, &token);
986
7.30M
            return;
987
7.30M
        }
988
7.34M
    }
989
990
69.2k
    token.type = T_REAL;
991
69.2k
    if (!str_to_double(ds_cstr(&p->buffer), &token.real)) {
992
63
        json_error(p, "number outside valid range");
993
63
        return;
994
63
    }
995
    /* Suppress negative zero. */
996
69.2k
    if (token.real == 0) {
997
295
        token.real = 0;
998
295
    }
999
69.2k
    json_parser_input(p, &token);
1000
69.2k
    return;
1001
1002
27
bad_exponent:
1003
27
    json_error(p, "exponent outside valid range");
1004
27
}
1005
1006
static const char *
1007
json_lex_4hex(const char *cp, const char *end, int *valuep)
1008
31.6k
{
1009
31.6k
    unsigned int value;
1010
31.6k
    bool ok;
1011
1012
31.6k
    if (cp + 4 > end) {
1013
738
        return "quoted string ends within \\u escape";
1014
738
    }
1015
1016
30.9k
    value = hexits_value(cp, 4, &ok);
1017
30.9k
    if (!ok) {
1018
1.14k
        return "malformed \\u escape";
1019
1.14k
    }
1020
29.8k
    if (!value) {
1021
428
        return "null bytes not supported in quoted strings";
1022
428
    }
1023
29.3k
    *valuep = value;
1024
29.3k
    return NULL;
1025
29.8k
}
1026
1027
static const char *
1028
json_lex_unicode(const char *cp, const char *end, struct ds *out)
1029
26.7k
{
1030
26.7k
    const char *error;
1031
26.7k
    int c0, c1;
1032
1033
26.7k
    error = json_lex_4hex(cp, end, &c0);
1034
26.7k
    if (error) {
1035
1.60k
        ds_clear(out);
1036
1.60k
        ds_put_cstr(out, error);
1037
1.60k
        return NULL;
1038
1.60k
    }
1039
25.1k
    cp += 4;
1040
25.1k
    if (!uc_is_leading_surrogate(c0)) {
1041
19.4k
        ds_put_utf8(out, c0);
1042
19.4k
        return cp;
1043
19.4k
    }
1044
1045
5.76k
    if (cp + 2 > end || *cp++ != '\\' || *cp++ != 'u') {
1046
865
        ds_clear(out);
1047
865
        ds_put_cstr(out, "malformed escaped surrogate pair");
1048
865
        return NULL;
1049
865
    }
1050
1051
4.90k
    error = json_lex_4hex(cp, end, &c1);
1052
4.90k
    if (error) {
1053
707
        ds_clear(out);
1054
707
        ds_put_cstr(out, error);
1055
707
        return NULL;
1056
707
    }
1057
4.19k
    cp += 4;
1058
4.19k
    if (!uc_is_trailing_surrogate(c1)) {
1059
289
        ds_clear(out);
1060
289
        ds_put_cstr(out, "second half of escaped surrogate pair is not "
1061
289
                    "trailing surrogate");
1062
289
        return NULL;
1063
289
    }
1064
1065
3.90k
    ds_put_utf8(out, utf16_decode_surrogate_pair(c0, c1));
1066
3.90k
    return cp;
1067
4.19k
}
1068
1069
bool
1070
json_string_unescape(const char *in, size_t in_len, char **outp)
1071
17.5k
{
1072
17.5k
    const char *end = in + in_len;
1073
17.5k
    bool ok = false;
1074
17.5k
    struct ds out;
1075
1076
17.5k
    ds_init(&out);
1077
17.5k
    ds_reserve(&out, in_len);
1078
39.1M
    while (in < end) {
1079
39.1M
        if (*in == '"') {
1080
994
            ds_clear(&out);
1081
994
            ds_put_cstr(&out, "quoted string may not include unescaped \"");
1082
994
            goto exit;
1083
994
        }
1084
39.1M
        if (*in != '\\') {
1085
38.7M
            ds_put_char(&out, *in++);
1086
38.7M
            continue;
1087
38.7M
        }
1088
1089
378k
        in++;
1090
378k
        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
343
            ds_clear(&out);
1096
343
            ds_put_cstr(&out, "quoted string may not end with backslash");
1097
343
            goto exit;
1098
343
        }
1099
378k
        switch (*in++) {
1100
323k
        case '"': case '\\': case '/':
1101
323k
            ds_put_char(&out, in[-1]);
1102
323k
            break;
1103
1104
4.72k
        case 'b':
1105
4.72k
            ds_put_char(&out, '\b');
1106
4.72k
            break;
1107
1108
14.0k
        case 'f':
1109
14.0k
            ds_put_char(&out, '\f');
1110
14.0k
            break;
1111
1112
2.26k
        case 'n':
1113
2.26k
            ds_put_char(&out, '\n');
1114
2.26k
            break;
1115
1116
2.87k
        case 'r':
1117
2.87k
            ds_put_char(&out, '\r');
1118
2.87k
            break;
1119
1120
3.00k
        case 't':
1121
3.00k
            ds_put_char(&out, '\t');
1122
3.00k
            break;
1123
1124
26.7k
        case 'u':
1125
26.7k
            in = json_lex_unicode(in, end, &out);
1126
26.7k
            if (!in) {
1127
3.46k
                goto exit;
1128
3.46k
            }
1129
23.3k
            break;
1130
1131
23.3k
        default:
1132
967
            ds_clear(&out);
1133
967
            ds_put_format(&out, "bad escape \\%c", in[-1]);
1134
967
            goto exit;
1135
378k
        }
1136
378k
    }
1137
11.7k
    ok = true;
1138
1139
17.5k
exit:
1140
17.5k
    *outp = ds_cstr(&out);
1141
17.5k
    return ok;
1142
11.7k
}
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
47.0k
{
1158
47.0k
    struct json_token token;
1159
1160
47.0k
    token.type = T_STRING;
1161
47.0k
    token.string = s;
1162
47.0k
    json_parser_input(p, &token);
1163
47.0k
}
1164
1165
static void
1166
json_lex_string(struct json_parser *p)
1167
47.1k
{
1168
47.1k
    const char *raw = ds_cstr(&p->buffer);
1169
47.1k
    if (!strchr(raw, '\\')) {
1170
35.5k
        json_parser_input_string(p, raw);
1171
35.5k
    } else {
1172
11.6k
        char *cooked;
1173
1174
11.6k
        if (json_string_unescape(raw, strlen(raw), &cooked)) {
1175
11.5k
            json_parser_input_string(p, cooked);
1176
11.5k
        } else {
1177
104
            json_error(p, "%s", cooked);
1178
104
        }
1179
1180
11.6k
        free(cooked);
1181
11.6k
    }
1182
47.1k
}
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.08k
{
1204
4.08k
    struct json_parser *p = json_parser_create(JSPF_TRAILER);
1205
4.08k
    json_parser_feed(p, string, strlen(string));
1206
4.08k
    return json_parser_finish(p);
1207
4.08k
}
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.08k
{
1280
4.08k
    struct json_parser *p = xzalloc(sizeof *p);
1281
4.08k
    p->flags = flags;
1282
4.08k
    return p;
1283
4.08k
}
1284
1285
static inline void ALWAYS_INLINE
1286
json_parser_account_byte(struct json_parser *p, unsigned char c)
1287
76.1M
{
1288
76.1M
    p->byte_number++;
1289
76.1M
    if (OVS_UNLIKELY(c == '\n')) {
1290
223
        p->column_number = 0;
1291
223
        p->line_number++;
1292
76.1M
    } else {
1293
76.1M
        p->column_number++;
1294
76.1M
    }
1295
76.1M
}
1296
1297
size_t
1298
json_parser_feed(struct json_parser *p, const char *input, size_t n)
1299
5.52k
{
1300
5.52k
    size_t token_start = 0;
1301
5.52k
    size_t i;
1302
1303
95.1M
    for (i = 0; !p->done && i < n; ) {
1304
95.1M
        bool consumed = true;
1305
1306
95.1M
        const char *start_p = &input[token_start];
1307
95.1M
        unsigned char c = input[i];
1308
95.1M
        struct json_token token;
1309
1310
95.1M
        switch (p->lex_state) {
1311
41.5M
        case JSON_LEX_START:
1312
41.5M
            switch (c) {
1313
1.49k
            case ' ': case '\t': case '\n': case '\r':
1314
                /* Nothing to do. */
1315
1.49k
                token_start = i + 1;
1316
1.49k
                break;
1317
1318
15
            case 'a': case 'b': case 'c': case 'd': case 'e':
1319
1.62k
            case 'f': case 'g': case 'h': case 'i': case 'j':
1320
57.4k
            case 'k': case 'l': case 'm': case 'n': case 'o':
1321
59.4k
            case 'p': case 'q': case 'r': case 's': case 't':
1322
59.4k
            case 'u': case 'v': case 'w': case 'x': case 'y':
1323
59.4k
            case 'z':
1324
59.4k
                p->lex_state = JSON_LEX_KEYWORD;
1325
59.4k
                token_start = i;
1326
59.4k
                break;
1327
1328
22.4M
            case '[': case '{': case ']': case '}': case ':': case ',':
1329
22.4M
                token.type = c;
1330
22.4M
                json_parser_input(p, &token);
1331
22.4M
                token_start = i + 1;
1332
22.4M
                break;
1333
1334
27.5k
            case '-':
1335
17.9M
            case '0': case '1': case '2': case '3': case '4':
1336
18.9M
            case '5': case '6': case '7': case '8': case '9':
1337
18.9M
                p->lex_state = JSON_LEX_NUMBER;
1338
18.9M
                token_start = i;
1339
18.9M
                break;
1340
1341
47.1k
            case '"':
1342
47.1k
                p->lex_state = JSON_LEX_STRING;
1343
47.1k
                token_start = i + 1;
1344
47.1k
                break;
1345
1346
10
            default:
1347
10
                if (isprint(c)) {
1348
1
                    json_error(p, "invalid character '%c'", c);
1349
9
                } else {
1350
9
                    json_error(p, "invalid character U+%04x", c);
1351
9
                }
1352
10
                break;
1353
41.5M
            }
1354
41.5M
            break;
1355
1356
41.5M
        case JSON_LEX_KEYWORD:
1357
1.30M
            if (!isalpha((unsigned char) c)) {
1358
59.4k
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1359
59.4k
                json_lex_keyword(p);
1360
59.4k
                consumed = false;
1361
59.4k
                break;
1362
59.4k
            }
1363
1.24M
            break;
1364
1365
22.7M
        case JSON_LEX_NUMBER:
1366
22.7M
            if (!strchr(".0123456789eE-+", c)) {
1367
18.9M
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1368
18.9M
                json_lex_number(p);
1369
18.9M
                consumed = false;
1370
18.9M
                break;
1371
18.9M
            }
1372
3.84M
            break;
1373
1374
29.1M
        case JSON_LEX_STRING:
1375
29.1M
            if (c == '\\') {
1376
332k
                p->lex_state = JSON_LEX_ESCAPE;
1377
28.8M
            } else if (c == '"') {
1378
47.1k
                ds_put_buffer(&p->buffer, start_p, i - token_start);
1379
47.1k
                json_lex_string(p);
1380
28.8M
            } else if (c < 0x20) {
1381
8
                json_error(p, "U+%04X must be escaped in quoted string", c);
1382
8
            }
1383
29.1M
            break;
1384
1385
332k
        case JSON_LEX_ESCAPE:
1386
332k
            p->lex_state = JSON_LEX_STRING;
1387
332k
            break;
1388
1389
0
        default:
1390
0
            ovs_abort(0, "unexpected lexer state");
1391
95.1M
        }
1392
1393
95.1M
        if (consumed) {
1394
76.1M
            json_parser_account_byte(p, c);
1395
76.1M
            i++;
1396
76.1M
        }
1397
95.1M
    }
1398
1399
5.52k
    if (!p->done) {
1400
3.81k
        ds_put_buffer(&p->buffer, &input[token_start], i - token_start);
1401
3.81k
    }
1402
5.52k
    return i;
1403
5.52k
}
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.08k
{
1414
4.08k
    struct json *json;
1415
1416
4.08k
    switch (p->lex_state) {
1417
2.48k
    case JSON_LEX_START:
1418
2.48k
        break;
1419
1420
154
    case JSON_LEX_STRING:
1421
162
    case JSON_LEX_ESCAPE:
1422
162
        json_error(p, "unexpected end of input in quoted string");
1423
162
        break;
1424
1425
1.25k
    case JSON_LEX_NUMBER:
1426
1.44k
    case JSON_LEX_KEYWORD:
1427
1.44k
        json_parser_feed(p, " ", 1);
1428
1.44k
        break;
1429
4.08k
    }
1430
1431
4.08k
    if (p->parse_state == JSON_PARSE_START) {
1432
1.56k
        json_error(p, "empty input stream");
1433
2.51k
    } else if (p->parse_state != JSON_PARSE_END) {
1434
1.00k
        json_error(p, "unexpected end of input");
1435
1.00k
    }
1436
1437
4.08k
    if (!p->error) {
1438
1.49k
        ovs_assert(p->height == 1);
1439
1.49k
        ovs_assert(p->stack[0].json != NULL);
1440
1.49k
        json = p->stack[--p->height].json;
1441
2.58k
    } else {
1442
2.58k
        json = json_string_create_nocopy(p->error);
1443
2.58k
        p->error = NULL;
1444
2.58k
    }
1445
1446
4.08k
    json_parser_abort(p);
1447
1448
4.08k
    return json;
1449
4.08k
}
1450
1451
void
1452
json_parser_abort(struct json_parser *p)
1453
4.08k
{
1454
4.08k
    if (p) {
1455
4.08k
        ds_destroy(&p->buffer);
1456
4.08k
        if (p->height) {
1457
1.02k
            json_destroy(p->stack[0].json);
1458
1.02k
        }
1459
4.08k
        free(p->stack);
1460
4.08k
        free(p->member_name);
1461
4.08k
        free(p->error);
1462
4.08k
        free(p);
1463
4.08k
    }
1464
4.08k
}
1465
1466
static struct json_parser_node *
1467
json_parser_top(struct json_parser *p)
1468
22.7M
{
1469
22.7M
    return &p->stack[p->height - 1];
1470
22.7M
}
1471
1472
static void
1473
json_parser_put_value(struct json_parser *p, struct json *value)
1474
20.2M
{
1475
20.2M
    struct json_parser_node *node = json_parser_top(p);
1476
20.2M
    if (node->json->type == JSON_OBJECT) {
1477
32.0k
        json_object_put_nocopy(node->json, p->member_name, value);
1478
32.0k
        p->member_name = NULL;
1479
20.2M
    } else if (node->json->type == JSON_ARRAY) {
1480
20.2M
        json_array_add(node->json, value);
1481
20.2M
    } else {
1482
0
        OVS_NOT_REACHED();
1483
0
    }
1484
20.2M
}
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.27M
{
1490
1.27M
    if (p->height < JSON_MAX_HEIGHT) {
1491
1.27M
        struct json_parser_node *node;
1492
1493
1.27M
        if (p->height >= p->allocated_height) {
1494
9.44k
            p->stack = x2nrealloc(p->stack, &p->allocated_height,
1495
9.44k
                                  sizeof *p->stack);
1496
9.44k
        }
1497
1498
1.27M
        if (p->height > 0) {
1499
1.27M
            json_parser_put_value(p, new_json);
1500
1.27M
        }
1501
1502
1.27M
        node = &p->stack[p->height++];
1503
1.27M
        node->json = new_json;
1504
1.27M
        p->parse_state = new_state;
1505
1.27M
    } 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.27M
}
1511
1512
static void
1513
json_parser_push_object(struct json_parser *p)
1514
815k
{
1515
815k
    json_parser_push(p, json_object_create(), JSON_PARSE_OBJECT_INIT);
1516
815k
}
1517
1518
static void
1519
json_parser_push_array(struct json_parser *p)
1520
460k
{
1521
460k
    json_parser_push(p, json_array_create_empty(), JSON_PARSE_ARRAY_INIT);
1522
460k
}
1523
1524
static void
1525
json_parse_value(struct json_parser *p, struct json_token *token,
1526
                 enum json_parse_state next_state)
1527
20.2M
{
1528
20.2M
    struct json *value;
1529
1530
20.2M
    switch (token->type) {
1531
1.56k
    case T_FALSE:
1532
1.56k
        value = json_boolean_create(false);
1533
1.56k
        break;
1534
1535
55.8k
    case T_NULL:
1536
55.8k
        value = json_null_create();
1537
55.8k
        break;
1538
1539
1.92k
    case T_TRUE:
1540
1.92k
        value = json_boolean_create(true);
1541
1.92k
        break;
1542
1543
814k
    case '{':
1544
814k
        json_parser_push_object(p);
1545
814k
        return;
1546
1547
459k
    case '[':
1548
459k
        json_parser_push_array(p);
1549
459k
        return;
1550
1551
18.8M
    case T_INTEGER:
1552
18.8M
        value = json_integer_create(token->integer);
1553
18.8M
        break;
1554
1555
68.7k
    case T_REAL:
1556
68.7k
        value = json_real_create(token->real);
1557
68.7k
        break;
1558
1559
14.4k
    case T_STRING:
1560
14.4k
        value = json_string_create(token->string);
1561
14.4k
        break;
1562
1563
0
    case T_EOF:
1564
2
    case '}':
1565
2
    case ']':
1566
10
    case ':':
1567
16
    case ',':
1568
16
    default:
1569
16
        json_error(p, "syntax error expecting value");
1570
16
        return;
1571
20.2M
    }
1572
1573
18.9M
    json_parser_put_value(p, value);
1574
18.9M
    p->parse_state = next_state;
1575
18.9M
}
1576
1577
static void
1578
json_parser_pop(struct json_parser *p)
1579
1.24M
{
1580
1.24M
    struct json_parser_node *node;
1581
1582
    /* Conserve memory. */
1583
1.24M
    node = json_parser_top(p);
1584
1.24M
    if (node->json->type == JSON_ARRAY) {
1585
432k
        json_array_trim(node->json);
1586
432k
    }
1587
1588
    /* Pop off the top-of-stack. */
1589
1.24M
    if (p->height == 1) {
1590
1.51k
        p->parse_state = JSON_PARSE_END;
1591
1.51k
        if (!(p->flags & JSPF_TRAILER)) {
1592
0
            p->done = true;
1593
0
        }
1594
1.24M
    } else {
1595
1.24M
        p->height--;
1596
1.24M
        node = json_parser_top(p);
1597
1.24M
        if (node->json->type == JSON_ARRAY) {
1598
1.23M
            p->parse_state = JSON_PARSE_ARRAY_NEXT;
1599
1.23M
        } else if (node->json->type == JSON_OBJECT) {
1600
5.76k
            p->parse_state = JSON_PARSE_OBJECT_NEXT;
1601
5.76k
        } else {
1602
0
            OVS_NOT_REACHED();
1603
0
        }
1604
1.24M
    }
1605
1.24M
}
1606
1607
static void
1608
json_parser_input(struct json_parser *p, struct json_token *token)
1609
41.5M
{
1610
41.5M
    switch (p->parse_state) {
1611
3.67k
    case JSON_PARSE_START:
1612
3.67k
        if (token->type == '{') {
1613
1.17k
            json_parser_push_object(p);
1614
2.49k
        } else if (token->type == '[') {
1615
1.34k
            json_parser_push_array(p);
1616
1.34k
        } else {
1617
1.15k
            json_error(p, "syntax error at beginning of input");
1618
1.15k
        }
1619
3.67k
        break;
1620
1621
21
    case JSON_PARSE_END:
1622
21
        json_error(p, "trailing garbage at end of input");
1623
21
        break;
1624
1625
815k
    case JSON_PARSE_OBJECT_INIT:
1626
815k
        if (token->type == '}') {
1627
804k
            json_parser_pop(p);
1628
804k
            break;
1629
804k
        }
1630
        /* Fall through. */
1631
32.1k
    case JSON_PARSE_OBJECT_NAME:
1632
32.1k
        if (token->type == T_STRING) {
1633
32.1k
            p->member_name = xstrdup(token->string);
1634
32.1k
            p->parse_state = JSON_PARSE_OBJECT_COLON;
1635
32.1k
        } else {
1636
29
            json_error(p, "syntax error parsing object expecting string");
1637
29
        }
1638
32.1k
        break;
1639
1640
32.1k
    case JSON_PARSE_OBJECT_COLON:
1641
32.1k
        if (token->type == ':') {
1642
32.1k
            p->parse_state = JSON_PARSE_OBJECT_VALUE;
1643
32.1k
        } else {
1644
10
            json_error(p, "syntax error parsing object expecting ':'");
1645
10
        }
1646
32.1k
        break;
1647
1648
32.1k
    case JSON_PARSE_OBJECT_VALUE:
1649
32.1k
        json_parse_value(p, token, JSON_PARSE_OBJECT_NEXT);
1650
32.1k
        break;
1651
1652
28.5k
    case JSON_PARSE_OBJECT_NEXT:
1653
28.5k
        if (token->type == ',') {
1654
21.6k
            p->parse_state = JSON_PARSE_OBJECT_NAME;
1655
21.6k
        } else if (token->type == '}') {
1656
6.83k
            json_parser_pop(p);
1657
6.83k
        } else {
1658
13
            json_error(p, "syntax error expecting '}' or ','");
1659
13
        }
1660
28.5k
        break;
1661
1662
460k
    case JSON_PARSE_ARRAY_INIT:
1663
460k
        if (token->type == ']') {
1664
143k
            json_parser_pop(p);
1665
143k
            break;
1666
143k
        }
1667
        /* Fall through. */
1668
20.2M
    case JSON_PARSE_ARRAY_VALUE:
1669
20.2M
        json_parse_value(p, token, JSON_PARSE_ARRAY_NEXT);
1670
20.2M
        break;
1671
1672
20.2M
    case JSON_PARSE_ARRAY_NEXT:
1673
20.2M
        if (token->type == ',') {
1674
19.9M
            p->parse_state = JSON_PARSE_ARRAY_VALUE;
1675
19.9M
        } else if (token->type == ']') {
1676
289k
            json_parser_pop(p);
1677
289k
        } else {
1678
33
            json_error(p, "syntax error expecting ']' or ','");
1679
33
        }
1680
20.2M
        break;
1681
1682
0
    default:
1683
0
        abort();
1684
41.5M
    }
1685
1686
41.5M
    p->lex_state = JSON_LEX_START;
1687
41.5M
    ds_clear(&p->buffer);
1688
41.5M
}
1689
1690
static struct json *
1691
json_create(enum json_type type)
1692
20.2M
{
1693
20.2M
    struct json *json = xmalloc(sizeof *json);
1694
20.2M
    json->type = type;
1695
20.2M
    json->count = 1;
1696
20.2M
    return json;
1697
20.2M
}
1698
1699
static void
1700
json_error(struct json_parser *p, const char *format, ...)
1701
4.42k
{
1702
4.42k
    if (!p->error) {
1703
2.58k
        struct ds msg;
1704
2.58k
        va_list args;
1705
1706
2.58k
        ds_init(&msg);
1707
2.58k
        ds_put_format(&msg, "line %d, column %d, byte %d: ",
1708
2.58k
                      p->line_number, p->column_number, p->byte_number);
1709
2.58k
        va_start(args, format);
1710
2.58k
        ds_put_format_valist(&msg, format, args);
1711
2.58k
        va_end(args);
1712
1713
2.58k
        p->error = ds_steal_cstr(&msg);
1714
1715
2.58k
        p->done = true;
1716
2.58k
    }
1717
4.42k
}
1718

1719
21.7M
#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.73k
{
1751
1.73k
    struct ds ds;
1752
1753
1.73k
    ds_init(&ds);
1754
1.73k
    json_to_ds(json, flags, &ds);
1755
1.73k
    return ds_steal_cstr(&ds);
1756
1.73k
}
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.73k
{
1762
1.73k
    struct json_serializer s;
1763
1764
1.73k
    s.ds = ds;
1765
1.73k
    s.depth = 0;
1766
1.73k
    s.flags = flags;
1767
1.73k
    json_serialize(json, &s);
1768
1.73k
}
1769
1770
static void
1771
json_serialize(const struct json *json, struct json_serializer *s)
1772
20.9M
{
1773
20.9M
    struct ds *ds = s->ds;
1774
1775
20.9M
    switch (json->type) {
1776
55.8k
    case JSON_NULL:
1777
55.8k
        ds_put_cstr(ds, "null");
1778
55.8k
        break;
1779
1780
1.31k
    case JSON_FALSE:
1781
1.31k
        ds_put_cstr(ds, "false");
1782
1.31k
        break;
1783
1784
1.71k
    case JSON_TRUE:
1785
1.71k
        ds_put_cstr(ds, "true");
1786
1.71k
        break;
1787
1788
816k
    case JSON_OBJECT:
1789
816k
        json_serialize_object(json->object, s);
1790
816k
        break;
1791
1792
575k
    case JSON_ARRAY:
1793
575k
        json_serialize_array(json, s);
1794
575k
        break;
1795
1796
19.4M
    case JSON_INTEGER:
1797
19.4M
        ds_put_format(ds, "%lld", json->integer);
1798
19.4M
        break;
1799
1800
71.0k
    case JSON_REAL:
1801
71.0k
        ds_put_format(ds, "%.*g", DBL_DIG, json->real);
1802
71.0k
        break;
1803
1804
13.5k
    case JSON_STRING:
1805
13.5k
        json_serialize_string(json_string(json), ds);
1806
13.5k
        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
20.9M
    }
1816
20.9M
}
1817
1818
static void
1819
indent_line(struct json_serializer *s)
1820
21.7M
{
1821
21.7M
    if (s->flags & JSSF_PRETTY) {
1822
21.7M
        ds_put_char(s->ds, '\n');
1823
21.7M
        ds_put_char_multiple(s->ds, ' ', SPACES_PER_LEVEL * s->depth);
1824
21.7M
    }
1825
21.7M
}
1826
1827
static void
1828
json_serialize_object_member(size_t i, const struct shash_node *node,
1829
                             struct json_serializer *s)
1830
25.9k
{
1831
25.9k
    struct ds *ds = s->ds;
1832
1833
25.9k
    if (i) {
1834
16.3k
        ds_put_char(ds, ',');
1835
16.3k
        indent_line(s);
1836
16.3k
    }
1837
1838
25.9k
    json_serialize_string(node->name, ds);
1839
25.9k
    ds_put_char(ds, ':');
1840
25.9k
    if (s->flags & JSSF_PRETTY) {
1841
25.9k
        ds_put_char(ds, ' ');
1842
25.9k
    }
1843
25.9k
    json_serialize(node->data, s);
1844
25.9k
}
1845
1846
static void
1847
json_serialize_object(const struct shash *object, struct json_serializer *s)
1848
816k
{
1849
816k
    struct ds *ds = s->ds;
1850
1851
816k
    ds_put_char(ds, '{');
1852
1853
816k
    s->depth++;
1854
816k
    indent_line(s);
1855
1856
816k
    if (s->flags & JSSF_YIELD) {
1857
0
        cooperative_multitasking_yield();
1858
0
    }
1859
1860
816k
    if (s->flags & JSSF_SORT) {
1861
816k
        const struct shash_node **nodes;
1862
816k
        size_t n, i;
1863
1864
816k
        nodes = shash_sort(object);
1865
816k
        n = shash_count(object);
1866
842k
        for (i = 0; i < n; i++) {
1867
25.9k
            json_serialize_object_member(i, nodes[i], s);
1868
25.9k
        }
1869
816k
        free(nodes);
1870
816k
    } 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
816k
    ds_put_char(ds, '}');
1881
816k
    s->depth--;
1882
816k
}
1883
1884
static void
1885
json_serialize_array(const struct json *json, struct json_serializer *s)
1886
575k
{
1887
575k
    size_t i, n = json_array_size(json);
1888
575k
    struct ds *ds = s->ds;
1889
1890
575k
    ds_put_char(ds, '[');
1891
575k
    s->depth++;
1892
1893
575k
    if (s->flags & JSSF_YIELD) {
1894
0
        cooperative_multitasking_yield();
1895
0
    }
1896
1897
575k
    if (n > 0) {
1898
301k
        indent_line(s);
1899
1900
21.2M
        for (i = 0; i < n; i++) {
1901
20.9M
            if (i) {
1902
20.6M
                ds_put_char(ds, ',');
1903
20.6M
                indent_line(s);
1904
20.6M
            }
1905
20.9M
            json_serialize(json_array_at(json, i), s);
1906
20.9M
        }
1907
301k
    }
1908
1909
575k
    s->depth--;
1910
575k
    ds_put_char(ds, ']');
1911
575k
}
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
39.5k
{
1951
39.5k
    uint8_t c;
1952
39.5k
    uint8_t c2;
1953
39.5k
    size_t count;
1954
39.5k
    const char *escape;
1955
39.5k
    const char *start;
1956
1957
39.5k
    ds_put_char(ds, '"');
1958
39.5k
    count = 0;
1959
39.5k
    start = string;
1960
14.7M
    while ((c = *string++) != '\0') {
1961
14.7M
        if (c >= ' ' && c != '"' && c != '\\') {
1962
14.1M
            count++;
1963
14.1M
        } else {
1964
638k
            if (count) {
1965
2.48k
                ds_put_buffer(ds, start, count);
1966
2.48k
                count = 0;
1967
2.48k
            }
1968
638k
            start = string;
1969
638k
            escape = chars_escaping[c];
1970
1.91M
            while ((c2 = *escape++) != '\0') {
1971
1.27M
                ds_put_char(ds, c2);
1972
1.27M
            }
1973
638k
        }
1974
14.7M
    }
1975
39.5k
    if (count) {
1976
32.8k
        ds_put_buffer(ds, start, count);
1977
32.8k
    }
1978
39.5k
    ds_put_char(ds, '"');
1979
39.5k
}