Coverage Report

Created: 2026-03-07 07:01

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