1 /*
2  * Copyright (c) 2017 Intel Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <zephyr/sys/__assert.h>
8 #include <ctype.h>
9 #include <errno.h>
10 #include <limits.h>
11 #include <math.h>
12 #include <zephyr/sys/printk.h>
13 #include <zephyr/sys/util.h>
14 #include <stdbool.h>
15 #include <stdlib.h>
16 #include <string.h>
17 #include <zephyr/types.h>
18 
19 #include <zephyr/data/json.h>
20 
21 struct json_obj_key_value {
22 	const char *key;
23 	size_t key_len;
24 	struct json_token value;
25 };
26 
lexer_consume(struct json_lexer * lex,struct json_token * tok,enum json_tokens empty_token)27 static bool lexer_consume(struct json_lexer *lex, struct json_token *tok,
28 			  enum json_tokens empty_token)
29 {
30 	if (lex->tok.type == empty_token) {
31 		return false;
32 	}
33 
34 	*tok = lex->tok;
35 	lex->tok.type = empty_token;
36 
37 	return true;
38 }
39 
lexer_next(struct json_lexer * lex,struct json_token * tok)40 static bool lexer_next(struct json_lexer *lex, struct json_token *tok)
41 {
42 	while (lex->state) {
43 		if (lexer_consume(lex, tok, JSON_TOK_NONE)) {
44 			return true;
45 		}
46 
47 		lex->state = lex->state(lex);
48 	}
49 
50 	return lexer_consume(lex, tok, JSON_TOK_EOF);
51 }
52 
53 static void *lexer_json(struct json_lexer *lex);
54 
emit(struct json_lexer * lex,enum json_tokens token)55 static void emit(struct json_lexer *lex, enum json_tokens token)
56 {
57 	lex->tok.type = token;
58 	lex->tok.start = lex->start;
59 	lex->tok.end = lex->pos;
60 	lex->start = lex->pos;
61 }
62 
next(struct json_lexer * lex)63 static int next(struct json_lexer *lex)
64 {
65 	if (lex->pos >= lex->end) {
66 		lex->pos = lex->end + 1;
67 
68 		return '\0';
69 	}
70 
71 	return *lex->pos++;
72 }
73 
ignore(struct json_lexer * lex)74 static void ignore(struct json_lexer *lex)
75 {
76 	lex->start = lex->pos;
77 }
78 
backup(struct json_lexer * lex)79 static void backup(struct json_lexer *lex)
80 {
81 	lex->pos--;
82 }
83 
peek(struct json_lexer * lex)84 static int peek(struct json_lexer *lex)
85 {
86 	int chr = next(lex);
87 
88 	backup(lex);
89 
90 	return chr;
91 }
92 
lexer_string(struct json_lexer * lex)93 static void *lexer_string(struct json_lexer *lex)
94 {
95 	ignore(lex);
96 
97 	while (true) {
98 		int chr = next(lex);
99 
100 		if (chr == '\0') {
101 			emit(lex, JSON_TOK_ERROR);
102 			return NULL;
103 		}
104 
105 		if (chr == '\\') {
106 			switch (next(lex)) {
107 			case '"':
108 			case '\\':
109 			case '/':
110 			case 'b':
111 			case 'f':
112 			case 'n':
113 			case 'r':
114 			case 't':
115 				continue;
116 			case 'u':
117 				if (isxdigit(next(lex)) == 0) {
118 					goto error;
119 				}
120 
121 				if (isxdigit(next(lex)) == 0) {
122 					goto error;
123 				}
124 
125 				if (isxdigit(next(lex)) == 0) {
126 					goto error;
127 				}
128 
129 				if (isxdigit(next(lex)) == 0) {
130 					goto error;
131 				}
132 
133 				break;
134 			default:
135 				goto error;
136 			}
137 		}
138 
139 		if (chr == '"') {
140 			backup(lex);
141 			emit(lex, JSON_TOK_STRING);
142 
143 			next(lex);
144 			ignore(lex);
145 
146 			return lexer_json;
147 		}
148 	}
149 
150 error:
151 	emit(lex, JSON_TOK_ERROR);
152 	return NULL;
153 }
154 
accept_run(struct json_lexer * lex,const char * run)155 static int accept_run(struct json_lexer *lex, const char *run)
156 {
157 	for (; *run; run++) {
158 		if (next(lex) != *run) {
159 			return -EINVAL;
160 		}
161 	}
162 
163 	return 0;
164 }
165 
lexer_boolean(struct json_lexer * lex)166 static void *lexer_boolean(struct json_lexer *lex)
167 {
168 	backup(lex);
169 
170 	switch (next(lex)) {
171 	case 't':
172 		if (!accept_run(lex, "rue")) {
173 			emit(lex, JSON_TOK_TRUE);
174 			return lexer_json;
175 		}
176 		break;
177 	case 'f':
178 		if (!accept_run(lex, "alse")) {
179 			emit(lex, JSON_TOK_FALSE);
180 			return lexer_json;
181 		}
182 		break;
183 	}
184 
185 	emit(lex, JSON_TOK_ERROR);
186 	return NULL;
187 }
188 
lexer_null(struct json_lexer * lex)189 static void *lexer_null(struct json_lexer *lex)
190 {
191 	if (accept_run(lex, "ull") < 0) {
192 		emit(lex, JSON_TOK_ERROR);
193 		return NULL;
194 	}
195 
196 	emit(lex, JSON_TOK_NULL);
197 	return lexer_json;
198 }
199 
lexer_number(struct json_lexer * lex)200 static void *lexer_number(struct json_lexer *lex)
201 {
202 	while (true) {
203 		int chr = next(lex);
204 
205 		if (isdigit(chr) != 0 || chr == '.' || chr == 'e' || chr == '+' || chr == '-') {
206 			continue;
207 		}
208 
209 		backup(lex);
210 		emit(lex, JSON_TOK_NUMBER);
211 
212 		return lexer_json;
213 	}
214 }
215 
lexer_number_nan(struct json_lexer * lex)216 static void *lexer_number_nan(struct json_lexer *lex)
217 {
218 #ifdef CONFIG_JSON_LIBRARY_FP_SUPPORT
219 	backup(lex);
220 
221 	switch (peek(lex)) {
222 	case 'N':
223 		if (!accept_run(lex, "NaN")) {
224 			emit(lex, JSON_TOK_NUMBER);
225 			return lexer_json;
226 		}
227 		break;
228 	case 'I':
229 		if (!accept_run(lex, "Infinity")) {
230 			emit(lex, JSON_TOK_NUMBER);
231 			return lexer_json;
232 		}
233 		break;
234 	case '-':
235 		if (!accept_run(lex, "-Infinity")) {
236 			emit(lex, JSON_TOK_NUMBER);
237 			return lexer_json;
238 		}
239 		break;
240 	}
241 
242 #endif
243 	emit(lex, JSON_TOK_ERROR);
244 	return NULL;
245 }
246 
lexer_json(struct json_lexer * lex)247 static void *lexer_json(struct json_lexer *lex)
248 {
249 	while (true) {
250 		int chr = next(lex);
251 
252 		switch (chr) {
253 		case '\0':
254 			emit(lex, JSON_TOK_EOF);
255 			return NULL;
256 		case '}':
257 		case '{':
258 		case '[':
259 		case ']':
260 		case ',':
261 		case ':':
262 			emit(lex, (enum json_tokens)chr);
263 			return lexer_json;
264 		case '"':
265 			return lexer_string;
266 		case 'n':
267 			return lexer_null;
268 		case 't':
269 		case 'f':
270 			return lexer_boolean;
271 		case 'N':
272 		case 'I':
273 			return lexer_number_nan;
274 		case '-':
275 			if (isdigit(peek(lex)) != 0) {
276 				return lexer_number;
277 			}
278 			if (peek(lex) == 'I') {
279 				return lexer_number_nan;
280 			}
281 
282 			__fallthrough;
283 		default:
284 			if (isspace(chr) != 0) {
285 				ignore(lex);
286 				continue;
287 			}
288 
289 			if (isdigit(chr) != 0) {
290 				return lexer_number;
291 			}
292 
293 			emit(lex, JSON_TOK_ERROR);
294 			return NULL;
295 		}
296 	}
297 }
298 
lexer_init(struct json_lexer * lex,char * data,size_t len)299 static void lexer_init(struct json_lexer *lex, char *data, size_t len)
300 {
301 	lex->state = lexer_json;
302 	lex->start = data;
303 	lex->pos = data;
304 	lex->end = data + len;
305 	lex->tok.type = JSON_TOK_NONE;
306 }
307 
obj_init(struct json_obj * json,char * data,size_t len)308 static int obj_init(struct json_obj *json, char *data, size_t len)
309 {
310 	struct json_token tok;
311 
312 	lexer_init(&json->lex, data, len);
313 
314 	if (!lexer_next(&json->lex, &tok)) {
315 		return -EINVAL;
316 	}
317 
318 	if (tok.type != JSON_TOK_OBJECT_START) {
319 		return -EINVAL;
320 	}
321 
322 	return 0;
323 }
324 
arr_init(struct json_obj * json,char * data,size_t len)325 static int arr_init(struct json_obj *json, char *data, size_t len)
326 {
327 	struct json_token tok;
328 
329 	lexer_init(&json->lex, data, len);
330 
331 	if (!lexer_next(&json->lex, &tok)) {
332 		return -EINVAL;
333 	}
334 
335 	if (tok.type != JSON_TOK_ARRAY_START) {
336 		return -EINVAL;
337 	}
338 
339 	return 0;
340 }
341 
element_token(enum json_tokens token)342 static int element_token(enum json_tokens token)
343 {
344 	switch (token) {
345 	case JSON_TOK_OBJECT_START:
346 	case JSON_TOK_ARRAY_START:
347 	case JSON_TOK_STRING:
348 	case JSON_TOK_STRING_BUF:
349 	case JSON_TOK_NUMBER:
350 	case JSON_TOK_INT:
351 	case JSON_TOK_UINT:
352 	case JSON_TOK_INT64:
353 	case JSON_TOK_UINT64:
354 	case JSON_TOK_FLOAT:
355 	case JSON_TOK_FLOAT_FP:
356 	case JSON_TOK_DOUBLE_FP:
357 	case JSON_TOK_OPAQUE:
358 	case JSON_TOK_OBJ_ARRAY:
359 	case JSON_TOK_TRUE:
360 	case JSON_TOK_FALSE:
361 		return 0;
362 	default:
363 		return -EINVAL;
364 	}
365 }
366 
obj_next(struct json_obj * json,struct json_obj_key_value * kv)367 static int obj_next(struct json_obj *json,
368 		    struct json_obj_key_value *kv)
369 {
370 	struct json_token tok;
371 
372 	if (!lexer_next(&json->lex, &tok)) {
373 		return -EINVAL;
374 	}
375 
376 	/* Match end of object or next key */
377 	switch (tok.type) {
378 	case JSON_TOK_OBJECT_END:
379 		kv->key = NULL;
380 		kv->key_len = 0;
381 		kv->value = tok;
382 
383 		return 0;
384 	case JSON_TOK_COMMA:
385 		if (!lexer_next(&json->lex, &tok)) {
386 			return -EINVAL;
387 		}
388 
389 		if (tok.type != JSON_TOK_STRING) {
390 			return -EINVAL;
391 		}
392 
393 		__fallthrough;
394 	case JSON_TOK_STRING:
395 		kv->key = tok.start;
396 		kv->key_len = (size_t)(tok.end - tok.start);
397 		break;
398 	default:
399 		return -EINVAL;
400 	}
401 
402 	/* Match : after key */
403 	if (!lexer_next(&json->lex, &tok)) {
404 		return -EINVAL;
405 	}
406 
407 	if (tok.type != JSON_TOK_COLON) {
408 		return -EINVAL;
409 	}
410 
411 	/* Match value */
412 	if (!lexer_next(&json->lex, &kv->value)) {
413 		return -EINVAL;
414 	}
415 
416 	return element_token(kv->value.type);
417 }
418 
arr_next(struct json_obj * json,struct json_token * value)419 static int arr_next(struct json_obj *json, struct json_token *value)
420 {
421 	if (!lexer_next(&json->lex, value)) {
422 		return -EINVAL;
423 	}
424 
425 	if (value->type == JSON_TOK_ARRAY_END) {
426 		return 0;
427 	}
428 
429 	if (value->type == JSON_TOK_COMMA) {
430 		if (!lexer_next(&json->lex, value)) {
431 			return -EINVAL;
432 		}
433 	}
434 
435 	return element_token(value->type);
436 }
437 
skip_field(struct json_obj * obj,struct json_obj_key_value * kv)438 static int skip_field(struct json_obj *obj, struct json_obj_key_value *kv)
439 {
440 	int field_count = 1;
441 
442 	if (kv->value.type == JSON_TOK_OBJECT_START ||
443 	    kv->value.type == JSON_TOK_ARRAY_START) {
444 		while (field_count > 0 && lexer_next(&obj->lex, &kv->value)) {
445 			switch (kv->value.type) {
446 			case JSON_TOK_OBJECT_START:
447 			case JSON_TOK_ARRAY_START:
448 				field_count++;
449 				break;
450 			case JSON_TOK_OBJECT_END:
451 			case JSON_TOK_ARRAY_END:
452 				field_count--;
453 				break;
454 			case JSON_TOK_ERROR:
455 				return -EINVAL;
456 			default:
457 				break;
458 			}
459 		}
460 	}
461 
462 	return 0;
463 }
464 
465 /**
466  * @brief Unescape a JSON string, can work in-place if src == dst
467  * @param src Source string with escape sequences
468  * @param dst Destination buffer for unescaped string (can be same as src)
469  * @param src_len Length of source string
470  * @param dst_size Size of destination buffer
471  * @return int Number of bytes written to destination, or -EINVAL on error
472  */
json_unescape_string(const char * src,char * dst,size_t src_len,size_t dst_size)473 static int json_unescape_string(const char *src, char *dst, size_t src_len, size_t dst_size)
474 {
475 	const char *src_end = src + src_len;
476 	char *dst_start = dst;
477 	char *dst_end = dst_start + dst_size - 1; /* Point to last available byte (for null) */
478 
479 	while (src < src_end && dst < dst_end) {
480 		if (*src == '\\') {
481 			src++;
482 			if (src >= src_end) {
483 				return -EINVAL;
484 			}
485 
486 			switch (*src) {
487 			case '"':
488 				*dst++ = '"';
489 				break;
490 			case '\\':
491 				*dst++ = '\\';
492 				break;
493 			case '/':
494 				*dst++ = '/';
495 				break;
496 			case 'b':
497 				*dst++ = '\b';
498 				break;
499 			case 'f':
500 				*dst++ = '\f';
501 				break;
502 			case 'n':
503 				*dst++ = '\n';
504 				break;
505 			case 'r':
506 				*dst++ = '\r';
507 				break;
508 			case 't':
509 				*dst++ = '\t';
510 				break;
511 			default:
512 				/* Unknown escape sequence, copy as-is */
513 				*dst++ = '\\';
514 				*dst++ = *src;
515 				break;
516 			}
517 			src++;
518 		} else {
519 			*dst++ = *src++;
520 		}
521 	}
522 
523 	*dst = '\0';
524 	return dst - dst_start;
525 }
526 
decode_string_buf(const struct json_token * token,char * str,size_t size)527 static int decode_string_buf(const struct json_token *token, char *str, size_t size)
528 {
529 	size_t escaped_len = token->end - token->start;
530 	int ret;
531 
532 	/* Safe approach: never copy more than (size - 1) bytes to leave room for null */
533 	size_t safe_len = (escaped_len < size) ? escaped_len : (size - 1);
534 
535 	ret = json_unescape_string(token->start, str, safe_len, size);
536 	if (ret < 0) {
537 		return -EINVAL;
538 	}
539 
540 	/* Check if we had to truncate due to the original escaped string being too long */
541 	if (escaped_len >= size) {
542 		return -EINVAL;
543 	}
544 
545 	return 0;
546 }
547 
decode_int32(const struct json_token * token,int32_t * num)548 static int decode_int32(const struct json_token *token, int32_t *num)
549 {
550 	/* FIXME: strtod() is not available in newlib/minimal libc,
551 	 * so using strtol() here.
552 	 */
553 	char *endptr;
554 	char prev_end;
555 
556 	prev_end = *token->end;
557 	*token->end = '\0';
558 
559 	errno = 0;
560 	*num = strtol(token->start, &endptr, 10);
561 
562 	*token->end = prev_end;
563 
564 	if (errno != 0) {
565 		return -errno;
566 	}
567 
568 	if (endptr != token->end) {
569 		return -EINVAL;
570 	}
571 
572 	return 0;
573 }
574 
decode_uint32(const struct json_token * token,uint32_t * num)575 static int decode_uint32(const struct json_token *token, uint32_t *num)
576 {
577 	char *endptr;
578 	char prev_end;
579 
580 	prev_end = *token->end;
581 	*token->end = '\0';
582 
583 	errno = 0;
584 	*num = strtoul(token->start, &endptr, 10);
585 
586 	*token->end = prev_end;
587 
588 	if (errno != 0) {
589 		return -errno;
590 	}
591 
592 	if (endptr != token->end) {
593 		return -EINVAL;
594 	}
595 
596 	return 0;
597 }
598 
decode_int64(const struct json_token * token,int64_t * num)599 static int decode_int64(const struct json_token *token, int64_t *num)
600 {
601 	char *endptr;
602 	char prev_end;
603 
604 	prev_end = *token->end;
605 	*token->end = '\0';
606 
607 	errno = 0;
608 	*num = strtoll(token->start, &endptr, 10);
609 
610 	*token->end = prev_end;
611 
612 	if (errno != 0) {
613 		return -errno;
614 	}
615 
616 	if (endptr != token->end) {
617 		return -EINVAL;
618 	}
619 
620 	return 0;
621 }
622 
decode_uint64(const struct json_token * token,uint64_t * num)623 static int decode_uint64(const struct json_token *token, uint64_t *num)
624 {
625 	char *endptr;
626 	char prev_end;
627 
628 	prev_end = *token->end;
629 	*token->end = '\0';
630 
631 	errno = 0;
632 	*num = strtoull(token->start, &endptr, 10);
633 
634 	*token->end = prev_end;
635 
636 	if (errno != 0) {
637 		return -errno;
638 	}
639 
640 	if (endptr != token->end) {
641 		return -EINVAL;
642 	}
643 
644 	return 0;
645 }
646 
decode_float(const struct json_token * token,float * num)647 static int decode_float(const struct json_token *token, float *num)
648 {
649 #ifdef CONFIG_JSON_LIBRARY_FP_SUPPORT
650 	char *endptr;
651 	char prev_end;
652 
653 	prev_end = *token->end;
654 	*token->end = '\0';
655 
656 	errno = 0;
657 	*num = strtof(token->start, &endptr);
658 
659 	*token->end = prev_end;
660 
661 	if (errno != 0) {
662 		return -errno;
663 	}
664 
665 	if (endptr != token->end) {
666 		return -EINVAL;
667 	}
668 
669 	return 0;
670 
671 #else
672 	ARG_UNUSED(token);
673 	ARG_UNUSED(num);
674 	return -EINVAL;
675 #endif
676 }
677 
decode_double(const struct json_token * token,double * num)678 static int decode_double(const struct json_token *token, double *num)
679 {
680 #ifdef CONFIG_JSON_LIBRARY_FP_SUPPORT
681 	char *endptr;
682 	char prev_end;
683 
684 	prev_end = *token->end;
685 	*token->end = '\0';
686 
687 	errno = 0;
688 	*num = strtod(token->start, &endptr);
689 
690 	*token->end = prev_end;
691 
692 	if (errno != 0) {
693 		return -errno;
694 	}
695 
696 	if (endptr != token->end) {
697 		return -EINVAL;
698 	}
699 
700 	return 0;
701 
702 #else
703 	ARG_UNUSED(token);
704 	ARG_UNUSED(num);
705 	return -EINVAL;
706 #endif
707 }
708 
decode_int8(const struct json_token * token,int8_t * num)709 static int decode_int8(const struct json_token *token, int8_t *num)
710 {
711 	int32_t num_i32;
712 	int res;
713 
714 	res = decode_int32(token, &num_i32);
715 
716 	if (res != 0) {
717 		return res;
718 	}
719 
720 	if (num_i32 < INT8_MIN || num_i32 > INT8_MAX) {
721 		return -EINVAL;
722 	}
723 
724 	*num = num_i32;
725 
726 	return 0;
727 }
728 
decode_uint8(const struct json_token * token,uint8_t * num)729 static int decode_uint8(const struct json_token *token, uint8_t *num)
730 {
731 	uint32_t num_u32;
732 	int res;
733 
734 	res = decode_uint32(token, &num_u32);
735 
736 	if (res != 0) {
737 		return res;
738 	}
739 
740 	if (num_u32 > UINT8_MAX) {
741 		return -EINVAL;
742 	}
743 
744 	*num = num_u32;
745 
746 	return 0;
747 }
748 
decode_int16(const struct json_token * token,int16_t * num)749 static int decode_int16(const struct json_token *token, int16_t *num)
750 {
751 	int32_t num_i32;
752 	int res;
753 
754 	res = decode_int32(token, &num_i32);
755 
756 	if (res != 0) {
757 		return res;
758 	}
759 
760 	if (num_i32 < INT16_MIN || num_i32 > INT16_MAX) {
761 		return -EINVAL;
762 	}
763 
764 	*num = num_i32;
765 
766 	return 0;
767 }
768 
decode_uint16(const struct json_token * token,uint16_t * num)769 static int decode_uint16(const struct json_token *token, uint16_t *num)
770 {
771 	uint32_t num_u32;
772 	int res;
773 
774 	res = decode_uint32(token, &num_u32);
775 
776 	if (res != 0) {
777 		return res;
778 	}
779 
780 	if (num_u32 > UINT16_MAX) {
781 		return -EINVAL;
782 	}
783 
784 	*num = num_u32;
785 
786 	return 0;
787 }
788 
decode_int(const struct json_token * token,void * field,size_t size)789 static int decode_int(const struct json_token *token, void *field, size_t size)
790 {
791 	switch (size) {
792 	case 1: {
793 		int8_t *num = field;
794 
795 		return decode_int8(token, num);
796 	}
797 	case 2: {
798 		int16_t *num = field;
799 
800 		return decode_int16(token, num);
801 	}
802 	case 4: {
803 		int32_t *num = field;
804 
805 		return decode_int32(token, num);
806 	}
807 	case 8: {
808 		int64_t *num = field;
809 
810 		return decode_int64(token, num);
811 	}
812 	default:
813 		return -EINVAL;
814 	}
815 }
816 
decode_uint(const struct json_token * token,void * field,size_t size)817 static int decode_uint(const struct json_token *token, void *field, size_t size)
818 {
819 	switch (size) {
820 	case 1: {
821 		uint8_t *num = field;
822 
823 		return decode_uint8(token, num);
824 	}
825 	case 2: {
826 		uint16_t *num = field;
827 
828 		return decode_uint16(token, num);
829 	}
830 	case 4: {
831 		uint32_t *num = field;
832 
833 		return decode_uint32(token, num);
834 	}
835 	case 8: {
836 		uint64_t *num = field;
837 
838 		return decode_uint64(token, num);
839 	}
840 	default:
841 		return -EINVAL;
842 	}
843 }
844 
equivalent_types(enum json_tokens type1,enum json_tokens type2)845 static bool equivalent_types(enum json_tokens type1, enum json_tokens type2)
846 {
847 	if (type1 == JSON_TOK_TRUE || type1 == JSON_TOK_FALSE) {
848 		return type2 == JSON_TOK_TRUE || type2 == JSON_TOK_FALSE;
849 	}
850 
851 	if (type1 == JSON_TOK_ARRAY_START && type2 == JSON_TOK_MIXED_ARRAY) {
852 		return true;
853 	}
854 
855 	if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_FLOAT) {
856 		return true;
857 	}
858 
859 	if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_FLOAT_FP) {
860 		return true;
861 	}
862 
863 	if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_DOUBLE_FP) {
864 		return true;
865 	}
866 
867 	if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_INT) {
868 		return true;
869 	}
870 
871 	if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_UINT) {
872 		return true;
873 	}
874 
875 	if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_INT64) {
876 		return true;
877 	}
878 
879 	if (type1 == JSON_TOK_NUMBER && type2 == JSON_TOK_UINT64) {
880 		return true;
881 	}
882 
883 	if (type1 == JSON_TOK_STRING && type2 == JSON_TOK_OPAQUE) {
884 		return true;
885 	}
886 
887 	if (type1 == JSON_TOK_STRING && type2 == JSON_TOK_STRING_BUF) {
888 		return true;
889 	}
890 
891 	if (type2 == JSON_TOK_ENCODED_OBJ) {
892 		return (type1 == JSON_TOK_OBJECT_START ||
893 			type1 == JSON_TOK_ARRAY_START ||
894 			type1 == JSON_TOK_STRING);
895 	}
896 
897 	if (type1 == JSON_TOK_ARRAY_START && type2 == JSON_TOK_OBJ_ARRAY) {
898 		return true;
899 	}
900 
901 	return type1 == type2;
902 }
903 
904 static int64_t obj_parse(struct json_obj *obj,
905 			 const struct json_obj_descr *descr, size_t descr_len,
906 			 void *val);
907 static int arr_parse(struct json_obj *obj,
908 		     const struct json_obj_descr *elem_descr,
909 		     size_t max_elements, void *field, void *val);
910 
911 static int arr_data_parse(struct json_obj *obj, struct json_obj_token *val);
912 
decode_value(struct json_obj * obj,const struct json_obj_descr * descr,struct json_token * value,void * field,void * val)913 static int64_t decode_value(struct json_obj *obj,
914 			    const struct json_obj_descr *descr,
915 			    struct json_token *value, void *field, void *val)
916 {
917 
918 	if (!equivalent_types(value->type, descr->type)) {
919 		return -EINVAL;
920 	}
921 
922 	switch (descr->type) {
923 	case JSON_TOK_OBJECT_START:
924 		return obj_parse(obj, descr->object.sub_descr,
925 				 descr->object.sub_descr_len,
926 				 field);
927 	case JSON_TOK_ARRAY_START:
928 		return arr_parse(obj, descr->array.element_descr,
929 				 descr->array.n_elements, field, val);
930 	case JSON_TOK_OBJ_ARRAY: {
931 		struct json_obj_token *obj_token = field;
932 
933 		obj_token->start = value->start;
934 		return arr_data_parse(obj, obj_token);
935 	}
936 
937 	case JSON_TOK_FALSE:
938 	case JSON_TOK_TRUE: {
939 		bool *v = field;
940 
941 		*v = value->type == JSON_TOK_TRUE;
942 
943 		return 0;
944 	}
945 	case JSON_TOK_NUMBER: {
946 		int32_t *num = field;
947 
948 		return decode_int32(value, num);
949 	}
950 	case JSON_TOK_INT: {
951 		return decode_int(value, field, descr->field.size);
952 	}
953 	case JSON_TOK_UINT: {
954 		return decode_uint(value, field, descr->field.size);
955 	}
956 	case JSON_TOK_INT64: {
957 		int64_t *num = field;
958 
959 		return decode_int64(value, num);
960 	}
961 	case JSON_TOK_UINT64: {
962 		uint64_t *num = field;
963 
964 		return decode_uint64(value, num);
965 	}
966 	case JSON_TOK_FLOAT_FP: {
967 		float *num = field;
968 
969 		return decode_float(value, num);
970 	}
971 	case JSON_TOK_DOUBLE_FP: {
972 		double *num = field;
973 
974 		return decode_double(value, num);
975 	}
976 	case JSON_TOK_OPAQUE:
977 	case JSON_TOK_FLOAT: {
978 		struct json_obj_token *obj_token = field;
979 
980 		obj_token->start = value->start;
981 		obj_token->length = value->end - value->start;
982 		return 0;
983 	}
984 	case JSON_TOK_STRING: {
985 		char **str = field;
986 
987 		*value->end = '\0';
988 		*str = value->start;
989 
990 		return 0;
991 	}
992 	case JSON_TOK_STRING_BUF: {
993 		char *str = field;
994 
995 		return decode_string_buf(value, str, descr->field.size);
996 	}
997 	default:
998 		return -EINVAL;
999 	}
1000 }
1001 
get_elem_size(const struct json_obj_descr * descr)1002 static ptrdiff_t get_elem_size(const struct json_obj_descr *descr)
1003 {
1004 	switch (descr->type) {
1005 	case JSON_TOK_NUMBER:
1006 		return sizeof(int32_t);
1007 	case JSON_TOK_INT64:
1008 		return sizeof(int64_t);
1009 	case JSON_TOK_UINT64:
1010 		return sizeof(uint64_t);
1011 	case JSON_TOK_FLOAT_FP:
1012 		return sizeof(float);
1013 	case JSON_TOK_DOUBLE_FP:
1014 		return sizeof(double);
1015 	case JSON_TOK_OPAQUE:
1016 	case JSON_TOK_FLOAT:
1017 	case JSON_TOK_OBJ_ARRAY:
1018 		return sizeof(struct json_obj_token);
1019 	case JSON_TOK_STRING:
1020 	case JSON_TOK_ENCODED_OBJ:
1021 		return sizeof(char *);
1022 	case JSON_TOK_INT:
1023 	case JSON_TOK_UINT:
1024 	case JSON_TOK_STRING_BUF:
1025 		return descr->field.size;
1026 	case JSON_TOK_TRUE:
1027 	case JSON_TOK_FALSE:
1028 		return sizeof(bool);
1029 	case JSON_TOK_ARRAY_START: {
1030 		ptrdiff_t size;
1031 
1032 		size = descr->array.n_elements * get_elem_size(descr->array.element_descr);
1033 		/* Consider additional item count field for array objects */
1034 		if (descr->field_name_len > 0) {
1035 			size = size + sizeof(size_t);
1036 		}
1037 
1038 		return size;
1039 	}
1040 	case JSON_TOK_OBJECT_START: {
1041 		ptrdiff_t total = 0;
1042 		uint32_t align_shift = 0;
1043 		size_t i;
1044 
1045 		for (i = 0; i < descr->object.sub_descr_len; i++) {
1046 			if (descr->object.sub_descr[i].align_shift > align_shift) {
1047 				align_shift = descr->object.sub_descr[i].align_shift;
1048 			}
1049 		}
1050 
1051 		i = descr->object.sub_descr_len;
1052 		if (i > 0) {
1053 			total = descr->object.sub_descr[i - 1].offset +
1054 				get_elem_size(&descr->object.sub_descr[i - 1]);
1055 		}
1056 
1057 		return ROUND_UP(total, 1 << align_shift);
1058 	}
1059 	default:
1060 		return -EINVAL;
1061 	}
1062 }
1063 
arr_parse(struct json_obj * obj,const struct json_obj_descr * elem_descr,size_t max_elements,void * field,void * val)1064 static int arr_parse(struct json_obj *obj,
1065 		     const struct json_obj_descr *elem_descr,
1066 		     size_t max_elements, void *field, void *val)
1067 {
1068 	void *value = val;
1069 	size_t *elements = (size_t *)((char *)value + elem_descr->offset);
1070 	ptrdiff_t elem_size;
1071 	void *last_elem;
1072 	struct json_token tok;
1073 
1074 	/* For nested arrays, skip parent descriptor to get elements */
1075 	if (elem_descr->type == JSON_TOK_ARRAY_START) {
1076 		elem_descr = elem_descr->array.element_descr;
1077 	}
1078 
1079 	*elements = 0;
1080 	elem_size = get_elem_size(elem_descr);
1081 	last_elem = (char *)field + elem_size * max_elements;
1082 
1083 	__ASSERT_NO_MSG(elem_size > 0);
1084 
1085 	while (!arr_next(obj, &tok)) {
1086 		if (tok.type == JSON_TOK_ARRAY_END) {
1087 			return 0;
1088 		}
1089 
1090 		if (field == last_elem) {
1091 			return -ENOSPC;
1092 		}
1093 
1094 		/* For nested arrays, update value to current field,
1095 		 * so it matches descriptor's offset to length field
1096 		 */
1097 		if (elem_descr->type == JSON_TOK_ARRAY_START) {
1098 			value = field;
1099 		}
1100 
1101 		if (decode_value(obj, elem_descr, &tok, field, value) < 0) {
1102 			return -EINVAL;
1103 		}
1104 
1105 		(*elements)++;
1106 		field = (char *)field + elem_size;
1107 	}
1108 
1109 	return -EINVAL;
1110 }
1111 
arr_data_parse(struct json_obj * obj,struct json_obj_token * val)1112 static int arr_data_parse(struct json_obj *obj, struct json_obj_token *val)
1113 {
1114 	bool string_state = false;
1115 	int array_in_array = 1;
1116 
1117 	/* Init length to zero */
1118 	val->length = 0;
1119 
1120 	while (obj->lex.pos != obj->lex.end) {
1121 		if (string_state) {
1122 			if (*obj->lex.pos == JSON_TOK_STRING) {
1123 				string_state = false;
1124 			}
1125 		} else {
1126 			if (*obj->lex.pos == JSON_TOK_ARRAY_END) {
1127 				array_in_array--;
1128 				if (array_in_array == 0) {
1129 					/* Set array data length + 1 object end */
1130 					val->length = obj->lex.pos - val->start + 1;
1131 					/* Init Lexer that Object Parse can be finished properly */
1132 					obj->lex.state = lexer_json;
1133 					/* Move position to before array end */
1134 					obj->lex.pos--;
1135 					obj->lex.tok.end = obj->lex.pos;
1136 					obj->lex.tok.start = val->start;
1137 					obj->lex.tok.type = JSON_TOK_NONE;
1138 					return 0;
1139 				}
1140 			} else if (*obj->lex.pos == JSON_TOK_STRING) {
1141 				string_state = true;
1142 			} else if (*obj->lex.pos == JSON_TOK_ARRAY_START) {
1143 				/* array in array update structure count */
1144 				array_in_array++;
1145 			}
1146 		}
1147 		obj->lex.pos++;
1148 	}
1149 
1150 	return -EINVAL;
1151 }
1152 
obj_parse(struct json_obj * obj,const struct json_obj_descr * descr,size_t descr_len,void * val)1153 static int64_t obj_parse(struct json_obj *obj, const struct json_obj_descr *descr,
1154 			 size_t descr_len, void *val)
1155 {
1156 	struct json_obj_key_value kv;
1157 	int64_t decoded_fields = 0;
1158 	size_t i;
1159 	int ret;
1160 
1161 	while (!obj_next(obj, &kv)) {
1162 		if (kv.value.type == JSON_TOK_OBJECT_END) {
1163 			return decoded_fields;
1164 		}
1165 
1166 		for (i = 0; i < descr_len; i++) {
1167 			void *decode_field = (char *)val + descr[i].offset;
1168 
1169 			/* Field has been decoded already, skip */
1170 			if (decoded_fields & ((int64_t)1 << i)) {
1171 				continue;
1172 			}
1173 
1174 			/* Check if it's the i-th field */
1175 			if (kv.key_len != descr[i].field_name_len) {
1176 				continue;
1177 			}
1178 
1179 			if (memcmp(kv.key, descr[i].field_name,
1180 				   descr[i].field_name_len)) {
1181 				continue;
1182 			}
1183 
1184 			/* Store the decoded value */
1185 			ret = decode_value(obj, &descr[i], &kv.value,
1186 					   decode_field, val);
1187 			if (ret < 0) {
1188 				return ret;
1189 			}
1190 
1191 			decoded_fields |= (int64_t)1<<i;
1192 			break;
1193 		}
1194 
1195 		/* Skip field, if no descriptor was found */
1196 		if (i >= descr_len) {
1197 			ret = skip_field(obj, &kv);
1198 			if (ret < 0) {
1199 				return ret;
1200 			}
1201 		}
1202 	}
1203 
1204 	return -EINVAL;
1205 }
1206 
json_obj_parse(char * payload,size_t len,const struct json_obj_descr * descr,size_t descr_len,void * val)1207 int64_t json_obj_parse(char *payload, size_t len,
1208 		       const struct json_obj_descr *descr, size_t descr_len,
1209 		       void *val)
1210 {
1211 	struct json_obj obj;
1212 	int64_t ret;
1213 
1214 	__ASSERT_NO_MSG(descr_len < (sizeof(ret) * CHAR_BIT - 1));
1215 
1216 	ret = obj_init(&obj, payload, len);
1217 	if (ret < 0) {
1218 		return ret;
1219 	}
1220 
1221 	return obj_parse(&obj, descr, descr_len, val);
1222 }
1223 
json_arr_parse(char * payload,size_t len,const struct json_obj_descr * descr,void * val)1224 int json_arr_parse(char *payload, size_t len,
1225 		   const struct json_obj_descr *descr, void *val)
1226 {
1227 	struct json_obj arr;
1228 	int ret;
1229 
1230 	ret = arr_init(&arr, payload, len);
1231 	if (ret < 0) {
1232 		return ret;
1233 	}
1234 
1235 	void *ptr = (char *)val + descr->offset;
1236 
1237 	return arr_parse(&arr, descr->array.element_descr,
1238 			 descr->array.n_elements, ptr, val);
1239 }
1240 
1241 
json_arr_separate_object_parse_init(struct json_obj * json,char * payload,size_t len)1242 int json_arr_separate_object_parse_init(struct json_obj *json, char *payload, size_t len)
1243 {
1244 	return arr_init(json, payload, len);
1245 }
1246 
json_arr_separate_parse_object(struct json_obj * json,const struct json_obj_descr * descr,size_t descr_len,void * val)1247 int json_arr_separate_parse_object(struct json_obj *json, const struct json_obj_descr *descr,
1248 			  size_t descr_len, void *val)
1249 {
1250 	struct json_token tok;
1251 
1252 	if (!lexer_next(&json->lex, &tok)) {
1253 		return -EINVAL;
1254 	}
1255 
1256 	if (tok.type == JSON_TOK_ARRAY_END) {
1257 		return 0;
1258 	} else if (tok.type == JSON_TOK_COMMA) {
1259 		if (!lexer_next(&json->lex, &tok)) {
1260 			return -EINVAL;
1261 		}
1262 	}
1263 
1264 	if (tok.type != JSON_TOK_OBJECT_START) {
1265 		return -EINVAL;
1266 	}
1267 
1268 	return obj_parse(json, descr, descr_len, val);
1269 }
1270 
escape_as(char chr)1271 static char escape_as(char chr)
1272 {
1273 	switch (chr) {
1274 	case '"':
1275 		return '"';
1276 	case '\\':
1277 		return '\\';
1278 	case '\b':
1279 		return 'b';
1280 	case '\f':
1281 		return 'f';
1282 	case '\n':
1283 		return 'n';
1284 	case '\r':
1285 		return 'r';
1286 	case '\t':
1287 		return 't';
1288 	}
1289 
1290 	return 0;
1291 }
1292 
json_escape_internal(const char * str,json_append_bytes_t append_bytes,void * data)1293 static int json_escape_internal(const char *str,
1294 				json_append_bytes_t append_bytes,
1295 				void *data)
1296 {
1297 	const char *cur;
1298 	int ret = 0;
1299 
1300 	if (str == NULL) {
1301 		return ret;
1302 	}
1303 
1304 	for (cur = str; ret == 0 && *cur; cur++) {
1305 		char escaped = escape_as(*cur);
1306 
1307 		if (escaped) {
1308 			char bytes[2] = { '\\', escaped };
1309 
1310 			ret = append_bytes(bytes, 2, data);
1311 		} else {
1312 			ret = append_bytes(cur, 1, data);
1313 		}
1314 	}
1315 
1316 	return ret;
1317 }
1318 
json_calc_escaped_len(const char * str,size_t len)1319 size_t json_calc_escaped_len(const char *str, size_t len)
1320 {
1321 	size_t escaped_len = len;
1322 	size_t pos;
1323 
1324 	for (pos = 0; pos < len; pos++) {
1325 		if (escape_as(str[pos])) {
1326 			escaped_len++;
1327 		}
1328 	}
1329 
1330 	return escaped_len;
1331 }
1332 
json_escape(char * str,size_t * len,size_t buf_size)1333 ssize_t json_escape(char *str, size_t *len, size_t buf_size)
1334 {
1335 	char *next; /* Points after next character to escape. */
1336 	char *dest; /* Points after next place to write escaped character. */
1337 	size_t escaped_len = json_calc_escaped_len(str, *len);
1338 
1339 	if (escaped_len == *len) {
1340 		/*
1341 		 * If no escape is necessary, there is nothing to do.
1342 		 */
1343 		return 0;
1344 	}
1345 
1346 	if (escaped_len >= buf_size) {
1347 		return -ENOMEM;
1348 	}
1349 
1350 	/*
1351 	 * By walking backwards in the buffer from the end positions
1352 	 * of both the original and escaped strings, we avoid using
1353 	 * extra space. Characters in the original string are
1354 	 * overwritten only after they have already been escaped.
1355 	 */
1356 	str[escaped_len] = '\0';
1357 	for (next = &str[*len], dest = &str[escaped_len]; next != str;) {
1358 		char next_c = *(--next);
1359 		char escape = escape_as(next_c);
1360 
1361 		if (escape) {
1362 			*(--dest) = escape;
1363 			*(--dest) = '\\';
1364 		} else {
1365 			*(--dest) = next_c;
1366 		}
1367 	}
1368 	*len = escaped_len;
1369 
1370 	return 0;
1371 }
1372 
1373 static int encode(const struct json_obj_descr *descr, const void *val,
1374 		  json_append_bytes_t append_bytes, void *data);
1375 
arr_encode(const struct json_obj_descr * elem_descr,const void * field,const void * val,json_append_bytes_t append_bytes,void * data)1376 static int arr_encode(const struct json_obj_descr *elem_descr,
1377 		      const void *field, const void *val,
1378 		      json_append_bytes_t append_bytes, void *data)
1379 {
1380 	ptrdiff_t elem_size;
1381 	/*
1382 	 * NOTE: Since an element descriptor's offset isn't meaningful
1383 	 * (array elements occur at multiple offsets in `val'), we use
1384 	 * its space in elem_descr to store the offset to the field
1385 	 * containing the number of elements.
1386 	 */
1387 	size_t n_elem = *(size_t *)((char *)val + elem_descr->offset);
1388 	size_t i;
1389 	int ret;
1390 
1391 	ret = append_bytes("[", 1, data);
1392 	if (ret < 0) {
1393 		return ret;
1394 	}
1395 
1396 	/* For nested arrays, skip parent descriptor to get elements */
1397 	if (elem_descr->type == JSON_TOK_ARRAY_START) {
1398 		elem_descr = elem_descr->array.element_descr;
1399 	}
1400 
1401 	elem_size = get_elem_size(elem_descr);
1402 
1403 	for (i = 0; i < n_elem; i++) {
1404 		/*
1405 		 * Though "field" points at the next element in the
1406 		 * array which we need to encode, the value in
1407 		 * elem_descr->offset is actually the offset of the
1408 		 * length field in the "parent" struct containing the
1409 		 * array.
1410 		 *
1411 		 * To patch things up, we lie to encode() about where
1412 		 * the field is by exactly the amount it will offset
1413 		 * it. This is a size optimization for struct
1414 		 * json_obj_descr: the alternative is to keep a
1415 		 * separate field next to element_descr which is an
1416 		 * offset to the length field in the parent struct,
1417 		 * but that would add a size_t to every descriptor.
1418 		 */
1419 		ret = encode(elem_descr, (char *)field - elem_descr->offset,
1420 			     append_bytes, data);
1421 		if (ret < 0) {
1422 			return ret;
1423 		}
1424 
1425 		if (i < n_elem - 1) {
1426 			ret = append_bytes(",", 1, data);
1427 			if (ret < 0) {
1428 				return ret;
1429 			}
1430 		}
1431 
1432 		field = (char *)field + elem_size;
1433 	}
1434 
1435 	return append_bytes("]", 1, data);
1436 }
1437 
str_encode(const char * str,json_append_bytes_t append_bytes,void * data)1438 static int str_encode(const char *str, json_append_bytes_t append_bytes,
1439 		      void *data)
1440 {
1441 	int ret;
1442 
1443 	ret = append_bytes("\"", 1, data);
1444 	if (ret < 0) {
1445 		return ret;
1446 	}
1447 
1448 	ret = json_escape_internal(str, append_bytes, data);
1449 	if (!ret) {
1450 		return append_bytes("\"", 1, data);
1451 	}
1452 
1453 	return ret;
1454 }
1455 
int32_encode(const int32_t * num,json_append_bytes_t append_bytes,void * data)1456 static int int32_encode(const int32_t *num, json_append_bytes_t append_bytes,
1457 			void *data)
1458 {
1459 	char buf[3 * sizeof(int32_t)];
1460 	int ret;
1461 
1462 	ret = snprintk(buf, sizeof(buf), "%d", *num);
1463 	if (ret < 0) {
1464 		return ret;
1465 	}
1466 	if (ret >= (int)sizeof(buf)) {
1467 		return -ENOMEM;
1468 	}
1469 
1470 	return append_bytes(buf, (size_t)ret, data);
1471 }
1472 
uint32_encode(const uint32_t * num,json_append_bytes_t append_bytes,void * data)1473 static int uint32_encode(const uint32_t *num, json_append_bytes_t append_bytes,
1474 			 void *data)
1475 {
1476 	char buf[3 * sizeof(uint32_t)];
1477 	int ret;
1478 
1479 	ret = snprintk(buf, sizeof(buf), "%u", *num);
1480 	if (ret < 0) {
1481 		return ret;
1482 	}
1483 	if (ret >= (int)sizeof(buf)) {
1484 		return -ENOMEM;
1485 	}
1486 
1487 	return append_bytes(buf, (size_t)ret, data);
1488 }
1489 
int64_encode(const int64_t * num,json_append_bytes_t append_bytes,void * data)1490 static int int64_encode(const int64_t *num, json_append_bytes_t append_bytes,
1491 			void *data)
1492 {
1493 	char buf[sizeof("-9223372036854775808")];
1494 	int ret;
1495 
1496 	ret = snprintk(buf, sizeof(buf), "%" PRId64, *num);
1497 	if (ret < 0) {
1498 		return ret;
1499 	}
1500 	if (ret >= (int)sizeof(buf)) {
1501 		return -ENOMEM;
1502 	}
1503 
1504 	return append_bytes(buf, (size_t)ret, data);
1505 }
1506 
uint64_encode(const uint64_t * num,json_append_bytes_t append_bytes,void * data)1507 static int uint64_encode(const uint64_t *num, json_append_bytes_t append_bytes,
1508 			void *data)
1509 {
1510 	char buf[sizeof("18446744073709551610")];
1511 	int ret;
1512 
1513 	ret = snprintk(buf, sizeof(buf), "%" PRIu64, *num);
1514 	if (ret < 0) {
1515 		return ret;
1516 	}
1517 	if (ret >= (int)sizeof(buf)) {
1518 		return -ENOMEM;
1519 	}
1520 
1521 	return append_bytes(buf, (size_t)ret, data);
1522 }
1523 
print_double(char * str,size_t size,const char * fmt,double num)1524 static int print_double(char *str, size_t size, const char *fmt, double num)
1525 {
1526 #ifdef CONFIG_JSON_LIBRARY_FP_SUPPORT
1527 	if (isnan(num)) {
1528 		return snprintk(str, size, "NaN");
1529 	}
1530 
1531 	if (isinf(num)) {
1532 		if (num < 0) {
1533 			return snprintk(str, size, "-Infinity");
1534 		}
1535 		return snprintk(str, size, "Infinity");
1536 	}
1537 
1538 	return snprintk(str, size, fmt, num);
1539 
1540 #else
1541 	str[0] = '\0';
1542 	ARG_UNUSED(size);
1543 	ARG_UNUSED(fmt);
1544 	ARG_UNUSED(num);
1545 	return -EINVAL;
1546 #endif
1547 }
1548 
float_encode(const float * num,json_append_bytes_t append_bytes,void * data)1549 static int float_encode(const float *num, json_append_bytes_t append_bytes, void *data)
1550 {
1551 	char buf[sizeof("-3.40282347e+38")];
1552 	int ret;
1553 
1554 	ret = print_double(buf, sizeof(buf), "%.9g", (double)*num);
1555 
1556 	if (ret < 0) {
1557 		return ret;
1558 	}
1559 	if (ret >= (int)sizeof(buf)) {
1560 		return -ENOMEM;
1561 	}
1562 
1563 	return append_bytes(buf, (size_t)ret, data);
1564 }
1565 
double_encode(const double * num,json_append_bytes_t append_bytes,void * data)1566 static int double_encode(const double *num, json_append_bytes_t append_bytes, void *data)
1567 {
1568 	char buf[sizeof("-1.797693134862316e+308")];
1569 	int ret;
1570 
1571 	ret = print_double(buf, sizeof(buf), "%.16g", *num);
1572 
1573 	if (ret < 0) {
1574 		return ret;
1575 	}
1576 	if (ret >= (int)sizeof(buf)) {
1577 		return -ENOMEM;
1578 	}
1579 
1580 	return append_bytes(buf, (size_t)ret, data);
1581 }
1582 
int_encode(const void * ptr,size_t size,json_append_bytes_t append_bytes,void * data)1583 static int int_encode(const void *ptr, size_t size, json_append_bytes_t append_bytes,
1584 		      void *data)
1585 {
1586 	switch (size) {
1587 	case 1: {
1588 		const int8_t *num_8 = ptr;
1589 		int32_t num = *num_8;
1590 
1591 		return int32_encode(&num, append_bytes, data);
1592 	}
1593 	case 2: {
1594 		const int16_t *num_16 = ptr;
1595 		int32_t num = *num_16;
1596 
1597 		return int32_encode(&num, append_bytes, data);
1598 	}
1599 	case 4: {
1600 		const int32_t *num_32 = ptr;
1601 		int32_t num = *num_32;
1602 
1603 		return int32_encode(&num, append_bytes, data);
1604 	}
1605 	case 8: {
1606 		const int64_t *num_64 = ptr;
1607 		int64_t num = *num_64;
1608 
1609 		return int64_encode(&num, append_bytes, data);
1610 	}
1611 	default:
1612 		return -EINVAL;
1613 	}
1614 }
1615 
uint_encode(const void * ptr,size_t size,json_append_bytes_t append_bytes,void * data)1616 static int uint_encode(const void *ptr, size_t size, json_append_bytes_t append_bytes,
1617 		       void *data)
1618 {
1619 	switch (size) {
1620 	case 1: {
1621 		const uint8_t *num_8 = ptr;
1622 		uint32_t num = *num_8;
1623 
1624 		return uint32_encode(&num, append_bytes, data);
1625 	}
1626 	case 2: {
1627 		const uint16_t *num_16 = ptr;
1628 		uint32_t num = *num_16;
1629 
1630 		return uint32_encode(&num, append_bytes, data);
1631 	}
1632 	case 4: {
1633 		const uint32_t *num_32 = ptr;
1634 		uint32_t num = *num_32;
1635 
1636 		return uint32_encode(&num, append_bytes, data);
1637 	}
1638 	case 8: {
1639 		const uint64_t *num_64 = ptr;
1640 		uint64_t num = *num_64;
1641 
1642 		return uint64_encode(&num, append_bytes, data);
1643 	}
1644 	default:
1645 		return -EINVAL;
1646 	}
1647 }
1648 
float_ascii_encode(struct json_obj_token * num,json_append_bytes_t append_bytes,void * data)1649 static int float_ascii_encode(struct json_obj_token *num, json_append_bytes_t append_bytes,
1650 		      void *data)
1651 {
1652 
1653 	return append_bytes(num->start, num->length, data);
1654 }
1655 
opaque_string_encode(struct json_obj_token * opaque,json_append_bytes_t append_bytes,void * data)1656 static int opaque_string_encode(struct json_obj_token *opaque, json_append_bytes_t append_bytes,
1657 		      void *data)
1658 {
1659 	int ret;
1660 
1661 	ret = append_bytes("\"", 1, data);
1662 	if (ret < 0) {
1663 		return ret;
1664 	}
1665 
1666 	ret = append_bytes(opaque->start, opaque->length, data);
1667 	if (ret < 0) {
1668 		return ret;
1669 	}
1670 
1671 	return append_bytes("\"", 1, data);
1672 }
1673 
encoded_obj_encode(const char ** str,json_append_bytes_t append_bytes,void * data)1674 static int encoded_obj_encode(const char **str, json_append_bytes_t append_bytes, void *data)
1675 {
1676 	size_t len = strlen(*str);
1677 
1678 	return append_bytes(*str, len, data);
1679 }
1680 
bool_encode(const bool * value,json_append_bytes_t append_bytes,void * data)1681 static int bool_encode(const bool *value, json_append_bytes_t append_bytes,
1682 		       void *data)
1683 {
1684 	if (*value) {
1685 		return append_bytes("true", 4, data);
1686 	}
1687 
1688 	return append_bytes("false", 5, data);
1689 }
1690 
encode(const struct json_obj_descr * descr,const void * val,json_append_bytes_t append_bytes,void * data)1691 static int encode(const struct json_obj_descr *descr, const void *val,
1692 		  json_append_bytes_t append_bytes, void *data)
1693 {
1694 	void *ptr = (char *)val + descr->offset;
1695 
1696 	switch (descr->type) {
1697 	case JSON_TOK_FALSE:
1698 	case JSON_TOK_TRUE:
1699 		return bool_encode(ptr, append_bytes, data);
1700 	case JSON_TOK_STRING: {
1701 		const char **str = ptr;
1702 
1703 		return str_encode(*str, append_bytes, data);
1704 	}
1705 	case JSON_TOK_STRING_BUF:
1706 		return str_encode(ptr, append_bytes, data);
1707 	case JSON_TOK_ARRAY_START:
1708 		return arr_encode(descr->array.element_descr, ptr,
1709 				  val, append_bytes, data);
1710 	case JSON_TOK_OBJECT_START:
1711 		return json_obj_encode(descr->object.sub_descr,
1712 				       descr->object.sub_descr_len,
1713 				       ptr, append_bytes, data);
1714 	case JSON_TOK_NUMBER:
1715 		return int32_encode(ptr, append_bytes, data);
1716 	case JSON_TOK_INT:
1717 		return int_encode(ptr, descr->field.size, append_bytes, data);
1718 	case JSON_TOK_UINT:
1719 		return uint_encode(ptr, descr->field.size, append_bytes, data);
1720 	case JSON_TOK_INT64:
1721 		return int64_encode(ptr, append_bytes, data);
1722 	case JSON_TOK_UINT64:
1723 		return uint64_encode(ptr, append_bytes, data);
1724 	case JSON_TOK_FLOAT_FP:
1725 		return float_encode(ptr, append_bytes, data);
1726 	case JSON_TOK_DOUBLE_FP:
1727 		return double_encode(ptr, append_bytes, data);
1728 	case JSON_TOK_FLOAT:
1729 		return float_ascii_encode(ptr, append_bytes, data);
1730 	case JSON_TOK_OPAQUE:
1731 		return opaque_string_encode(ptr, append_bytes, data);
1732 	case JSON_TOK_ENCODED_OBJ:
1733 		return encoded_obj_encode(ptr, append_bytes, data);
1734 	default:
1735 		return -EINVAL;
1736 	}
1737 }
1738 
json_obj_encode(const struct json_obj_descr * descr,size_t descr_len,const void * val,json_append_bytes_t append_bytes,void * data)1739 int json_obj_encode(const struct json_obj_descr *descr, size_t descr_len,
1740 		    const void *val, json_append_bytes_t append_bytes,
1741 		    void *data)
1742 {
1743 	size_t i;
1744 	int ret;
1745 
1746 	ret = append_bytes("{", 1, data);
1747 	if (ret < 0) {
1748 		return ret;
1749 	}
1750 
1751 	for (i = 0; i < descr_len; i++) {
1752 		ret = str_encode(descr[i].field_name, append_bytes, data);
1753 		if (ret < 0) {
1754 			return ret;
1755 		}
1756 
1757 		ret = append_bytes(":", 1, data);
1758 		if (ret < 0) {
1759 			return ret;
1760 		}
1761 
1762 		ret = encode(&descr[i], val, append_bytes, data);
1763 		if (ret < 0) {
1764 			return ret;
1765 		}
1766 
1767 		if (i < descr_len - 1) {
1768 			ret = append_bytes(",", 1, data);
1769 			if (ret < 0) {
1770 				return ret;
1771 			}
1772 		}
1773 	}
1774 
1775 	return append_bytes("}", 1, data);
1776 }
1777 
json_arr_encode(const struct json_obj_descr * descr,const void * val,json_append_bytes_t append_bytes,void * data)1778 int json_arr_encode(const struct json_obj_descr *descr, const void *val,
1779 		    json_append_bytes_t append_bytes, void *data)
1780 {
1781 	void *ptr = (char *)val + descr->offset;
1782 
1783 	return arr_encode(descr->array.element_descr, ptr, val, append_bytes,
1784 			  data);
1785 }
1786 
1787 struct appender {
1788 	char *buffer;
1789 	size_t used;
1790 	size_t size;
1791 };
1792 
append_bytes_to_buf(const char * bytes,size_t len,void * data)1793 static int append_bytes_to_buf(const char *bytes, size_t len, void *data)
1794 {
1795 	struct appender *appender = data;
1796 
1797 	if (len >= appender->size - appender->used) {
1798 		return -ENOMEM;
1799 	}
1800 
1801 	memcpy(appender->buffer + appender->used, bytes, len);
1802 	appender->used += len;
1803 	appender->buffer[appender->used] = '\0';
1804 
1805 	return 0;
1806 }
1807 
json_obj_encode_buf(const struct json_obj_descr * descr,size_t descr_len,const void * val,char * buffer,size_t buf_size)1808 int json_obj_encode_buf(const struct json_obj_descr *descr, size_t descr_len,
1809 			const void *val, char *buffer, size_t buf_size)
1810 {
1811 	struct appender appender = { .buffer = buffer, .size = buf_size };
1812 
1813 	return json_obj_encode(descr, descr_len, val, append_bytes_to_buf,
1814 			       &appender);
1815 }
1816 
json_arr_encode_buf(const struct json_obj_descr * descr,const void * val,char * buffer,size_t buf_size)1817 int json_arr_encode_buf(const struct json_obj_descr *descr, const void *val,
1818 			char *buffer, size_t buf_size)
1819 {
1820 	struct appender appender = { .buffer = buffer, .size = buf_size };
1821 
1822 	return json_arr_encode(descr, val, append_bytes_to_buf, &appender);
1823 }
1824 
measure_bytes(const char * bytes,size_t len,void * data)1825 static int measure_bytes(const char *bytes, size_t len, void *data)
1826 {
1827 	ssize_t *total = data;
1828 
1829 	*total += (ssize_t)len;
1830 
1831 	ARG_UNUSED(bytes);
1832 
1833 	return 0;
1834 }
1835 
json_calc_encoded_len(const struct json_obj_descr * descr,size_t descr_len,const void * val)1836 ssize_t json_calc_encoded_len(const struct json_obj_descr *descr,
1837 			      size_t descr_len, const void *val)
1838 {
1839 	ssize_t total = 0;
1840 	int ret;
1841 
1842 	ret = json_obj_encode(descr, descr_len, val, measure_bytes, &total);
1843 	if (ret < 0) {
1844 		return ret;
1845 	}
1846 
1847 	return total;
1848 }
1849 
json_calc_encoded_arr_len(const struct json_obj_descr * descr,const void * val)1850 ssize_t json_calc_encoded_arr_len(const struct json_obj_descr *descr,
1851 				  const void *val)
1852 {
1853 	ssize_t total = 0;
1854 	int ret;
1855 
1856 	ret = json_arr_encode(descr, val, measure_bytes, &total);
1857 	if (ret < 0) {
1858 		return ret;
1859 	}
1860 
1861 	return total;
1862 }
1863 
1864 
1865 static int mixed_arr_parse(struct json_obj *arr,
1866 			   const struct json_mixed_arr_descr *descr,
1867 			   size_t descr_len, void *val);
1868 int json_mixed_arr_encode(const struct json_mixed_arr_descr *descr,
1869 			  size_t descr_len, void *val,
1870 			  json_append_bytes_t append_bytes,
1871 			  void *data);
1872 
extract_raw_json_data(struct json_obj * obj,struct json_token * value,char ** field_ptr)1873 static int extract_raw_json_data(struct json_obj *obj, struct json_token *value,
1874 				 char **field_ptr)
1875 {
1876 	char *start_pos = value->start;
1877 
1878 	switch (value->type) {
1879 	case JSON_TOK_OBJECT_START:
1880 	case JSON_TOK_ARRAY_START: {
1881 	struct json_obj_key_value kv = {
1882 		.key = NULL,
1883 		.key_len = 0,
1884 		.value = *value
1885 	};
1886 
1887 	int ret = skip_field(obj, &kv);
1888 
1889 	if (ret < 0) {
1890 		return ret;
1891 	}
1892 
1893 	char *end_pos = obj->lex.pos;
1894 	*end_pos = '\0';
1895 	*field_ptr = start_pos;
1896 
1897 	return 0;
1898 	}
1899 
1900 	case JSON_TOK_STRING:
1901 	*value->end = '\0';
1902 	*field_ptr = start_pos;
1903 	return 0;
1904 
1905 	default:
1906 	return -EINVAL;
1907 	}
1908 }
1909 
decode_mixed_value(struct json_obj * obj,const struct json_mixed_arr_descr * elem,struct json_token * value,void * field,void * val)1910 static int64_t decode_mixed_value(struct json_obj *obj,
1911 				  const struct json_mixed_arr_descr *elem,
1912 				  struct json_token *value,
1913 				  void *field, void *val)
1914 {
1915 	if (!equivalent_types(value->type, elem->type)) {
1916 		return -EINVAL;
1917 	}
1918 
1919 	switch (elem->type) {
1920 	case JSON_TOK_OBJECT_START: {
1921 		return obj_parse(obj, elem->object.sub_descr,
1922 				 elem->object.sub_descr_len, field);
1923 	}
1924 	case JSON_TOK_ARRAY_START: {
1925 		const struct json_obj_descr *actual_elem_descr = elem->array.element_descr;
1926 		size_t actual_n_elements = elem->array.n_elements;
1927 
1928 		if (actual_elem_descr->type == JSON_TOK_ARRAY_START) {
1929 			actual_elem_descr = actual_elem_descr->array.element_descr;
1930 		}
1931 		return arr_parse(obj, actual_elem_descr, actual_n_elements, field, val);
1932 	}
1933 	case JSON_TOK_MIXED_ARRAY: {
1934 		return mixed_arr_parse(obj, elem->mixed_array.sub_descr,
1935 				       elem->mixed_array.sub_descr_len,
1936 				       field);
1937 	}
1938 	case JSON_TOK_FALSE:
1939 	case JSON_TOK_TRUE: {
1940 		bool *v = field;
1941 
1942 		*v = (value->type == JSON_TOK_TRUE);
1943 		return 0;
1944 	}
1945 	case JSON_TOK_NUMBER: {
1946 		int32_t *num32 = field;
1947 
1948 		return decode_int32(value, num32);
1949 	}
1950 	case JSON_TOK_INT: {
1951 		return decode_int(value, field, elem->primitive.size);
1952 	}
1953 	case JSON_TOK_UINT: {
1954 		return decode_uint(value, field, elem->primitive.size);
1955 	}
1956 	case JSON_TOK_INT64: {
1957 		int64_t *num64 = field;
1958 
1959 		return decode_int64(value, num64);
1960 	}
1961 	case JSON_TOK_UINT64: {
1962 		uint64_t *unum64 = field;
1963 
1964 		return decode_uint64(value, unum64);
1965 	}
1966 	case JSON_TOK_FLOAT_FP: {
1967 		float *f_num = field;
1968 
1969 		return decode_float(value, f_num);
1970 	}
1971 	case JSON_TOK_DOUBLE_FP: {
1972 		double *d_num = field;
1973 
1974 		return decode_double(value, d_num);
1975 	}
1976 	case JSON_TOK_STRING: {
1977 		char **str_ptr = field;
1978 
1979 		*value->end = '\0';
1980 		*str_ptr = value->start;
1981 		return 0;
1982 	}
1983 	case JSON_TOK_STRING_BUF: {
1984 		char *str_buf = field;
1985 
1986 		return decode_string_buf(value, str_buf, elem->primitive.size);
1987 	}
1988 	case JSON_TOK_OBJ_ARRAY: {
1989 		struct json_obj_token *obj_token = field;
1990 
1991 		obj_token->start = value->start;
1992 		return arr_data_parse(obj, obj_token);
1993 	}
1994 	case JSON_TOK_OPAQUE:
1995 	case JSON_TOK_FLOAT: {
1996 		struct json_obj_token *obj_token = field;
1997 
1998 		obj_token->start = value->start;
1999 		obj_token->length = value->end - value->start;
2000 		return 0;
2001 	}
2002 	case JSON_TOK_ENCODED_OBJ: {
2003 		char **str_ptr = field;
2004 
2005 		return extract_raw_json_data(obj, value, str_ptr);
2006 	}
2007 	case JSON_TOK_NULL: {
2008 		memset(field, 0, elem->primitive.size);
2009 		return 0;
2010 	}
2011 	default:
2012 		return -EINVAL;
2013 	}
2014 }
2015 
encode_mixed_value(const struct json_mixed_arr_descr * elem,void * field,void * val,json_append_bytes_t append_bytes,void * data)2016 static int encode_mixed_value(const struct json_mixed_arr_descr *elem,
2017 			      void *field, void *val,
2018 			      json_append_bytes_t append_bytes, void *data)
2019 {
2020 
2021 	switch (elem->type) {
2022 	case JSON_TOK_OBJECT_START: {
2023 		return json_obj_encode(elem->object.sub_descr,
2024 				       elem->object.sub_descr_len,
2025 				       field, append_bytes, data);
2026 	}
2027 	case JSON_TOK_ARRAY_START: {
2028 		const struct json_obj_descr *actual_elem_descr = elem->array.element_descr;
2029 
2030 		if (actual_elem_descr->type == JSON_TOK_ARRAY_START) {
2031 			actual_elem_descr = actual_elem_descr->array.element_descr;
2032 		}
2033 		return arr_encode(actual_elem_descr, field, val, append_bytes, data);
2034 	}
2035 	case JSON_TOK_MIXED_ARRAY: {
2036 		return json_mixed_arr_encode(elem->mixed_array.sub_descr,
2037 					   elem->mixed_array.sub_descr_len,
2038 					   field, append_bytes, data);
2039 	}
2040 	case JSON_TOK_FALSE:
2041 	case JSON_TOK_TRUE: {
2042 		return bool_encode(field, append_bytes, data);
2043 	}
2044 	case JSON_TOK_STRING: {
2045 		return str_encode(*((char **)field), append_bytes, data);
2046 	}
2047 	case JSON_TOK_STRING_BUF: {
2048 		return str_encode(field, append_bytes, data);
2049 	}
2050 	case JSON_TOK_NUMBER: {
2051 		return int32_encode(field, append_bytes, data);
2052 	}
2053 	case JSON_TOK_INT: {
2054 		return int_encode(field, elem->primitive.size, append_bytes, data);
2055 	}
2056 	case JSON_TOK_UINT: {
2057 		return uint_encode(field, elem->primitive.size, append_bytes, data);
2058 	}
2059 	case JSON_TOK_INT64: {
2060 		return int64_encode(field, append_bytes, data);
2061 	}
2062 	case JSON_TOK_UINT64: {
2063 		return uint64_encode(field, append_bytes, data);
2064 	}
2065 	case JSON_TOK_FLOAT_FP: {
2066 		return float_encode(field, append_bytes, data);
2067 	}
2068 	case JSON_TOK_DOUBLE_FP: {
2069 		return double_encode(field, append_bytes, data);
2070 	}
2071 	case JSON_TOK_FLOAT: {
2072 		return float_ascii_encode(field, append_bytes, data);
2073 	}
2074 	case JSON_TOK_OPAQUE: {
2075 		return opaque_string_encode(field, append_bytes, data);
2076 	}
2077 	case JSON_TOK_ENCODED_OBJ: {
2078 		return encoded_obj_encode((const char **)field, append_bytes, data);
2079 	}
2080 	default:
2081 		return -EINVAL;
2082 	}
2083 }
2084 
mixed_arr_parse(struct json_obj * arr,const struct json_mixed_arr_descr * descr,size_t descr_len,void * val)2085 static int mixed_arr_parse(struct json_obj *arr,
2086 			   const struct json_mixed_arr_descr *descr,
2087 			   size_t descr_len, void *val)
2088 {
2089 	struct json_token tok;
2090 	size_t elem_idx = 0;
2091 	void *field_ptr;
2092 	int ret;
2093 
2094 	if (descr_len == 0) {
2095 		if (!arr_next(arr, &tok) && tok.type == JSON_TOK_ARRAY_END) {
2096 			return 0;
2097 		}
2098 		return -EINVAL;
2099 	}
2100 
2101 	while (!arr_next(arr, &tok)) {
2102 		if (tok.type == JSON_TOK_ARRAY_END) {
2103 			return elem_idx;
2104 		}
2105 
2106 		if (elem_idx >= descr_len) {
2107 			return -ENOSPC;
2108 		}
2109 
2110 		switch (descr[elem_idx].type) {
2111 		case JSON_TOK_OBJECT_START:
2112 			field_ptr = (char *)val + descr[elem_idx].object.offset;
2113 			break;
2114 		case JSON_TOK_ARRAY_START:
2115 			field_ptr = (char *)val + descr[elem_idx].array.offset;
2116 			break;
2117 		case JSON_TOK_MIXED_ARRAY:
2118 			field_ptr = (char *)val + descr[elem_idx].mixed_array.offset;
2119 			break;
2120 		default:
2121 			field_ptr = (char *)val + descr[elem_idx].primitive.offset;
2122 			break;
2123 		}
2124 
2125 		ret = decode_mixed_value(arr, &descr[elem_idx], &tok, field_ptr, val);
2126 		if (ret < 0) {
2127 			return ret;
2128 		}
2129 
2130 		elem_idx++;
2131 	}
2132 
2133 	return elem_idx;
2134 }
2135 
json_mixed_arr_parse(char * json,size_t len,const struct json_mixed_arr_descr * descr,size_t descr_len,void * val)2136 int json_mixed_arr_parse(char *json, size_t len,
2137 			 const struct json_mixed_arr_descr *descr,
2138 			 size_t descr_len, void *val)
2139 {
2140 	struct json_obj arr;
2141 	int ret;
2142 
2143 	ret = arr_init(&arr, json, len);
2144 	if (ret < 0) {
2145 		return ret;
2146 	}
2147 
2148 	return mixed_arr_parse(&arr, descr, descr_len, val);
2149 }
2150 
json_mixed_arr_encode(const struct json_mixed_arr_descr * descr,size_t descr_len,void * val,json_append_bytes_t append_bytes,void * data)2151 int json_mixed_arr_encode(const struct json_mixed_arr_descr *descr,
2152 			  size_t descr_len, void *val,
2153 			  json_append_bytes_t append_bytes,
2154 			  void *data)
2155 {
2156 	size_t *element_count;
2157 	size_t i;
2158 	int ret;
2159 	void *field_ptr;
2160 
2161 	if (descr_len == 0) {
2162 		return append_bytes("[]", 2, data);
2163 	}
2164 
2165 	element_count = (size_t *)((char *)val + descr[0].count_offset);
2166 
2167 	ret = append_bytes("[", 1, data);
2168 	if (ret < 0) {
2169 		return ret;
2170 	}
2171 
2172 	for (i = 0; i < *element_count && i < descr_len; i++) {
2173 		switch (descr[i].type) {
2174 		case JSON_TOK_OBJECT_START:
2175 			field_ptr = (char *)val + descr[i].object.offset;
2176 			break;
2177 		case JSON_TOK_ARRAY_START:
2178 			field_ptr = (char *)val + descr[i].array.offset;
2179 			break;
2180 		case JSON_TOK_MIXED_ARRAY:
2181 			field_ptr = (char *)val + descr[i].mixed_array.offset;
2182 			break;
2183 		default:
2184 			field_ptr = (char *)val + descr[i].primitive.offset;
2185 			break;
2186 		}
2187 
2188 		ret = encode_mixed_value(&descr[i], field_ptr, val, append_bytes, data);
2189 		if (ret < 0) {
2190 			return ret;
2191 		}
2192 
2193 		if (i < *element_count - 1) {
2194 			ret = append_bytes(",", 1, data);
2195 			if (ret < 0) {
2196 				return ret;
2197 			}
2198 		}
2199 	}
2200 
2201 	return append_bytes("]", 1, data);
2202 }
2203 
json_mixed_arr_encode_buf(const struct json_mixed_arr_descr * descr,size_t descr_len,void * val,char * buffer,size_t buf_size)2204 int json_mixed_arr_encode_buf(const struct json_mixed_arr_descr *descr,
2205 			      size_t descr_len, void *val,
2206 			      char *buffer, size_t buf_size)
2207 {
2208 	struct appender appender = { .buffer = buffer, .size = buf_size };
2209 
2210 	return json_mixed_arr_encode(descr, descr_len, val, append_bytes_to_buf, &appender);
2211 }
2212 
json_calc_mixed_arr_len(const struct json_mixed_arr_descr * descr,size_t descr_len,void * val)2213 ssize_t json_calc_mixed_arr_len(const struct json_mixed_arr_descr *descr,
2214 				size_t descr_len, void *val)
2215 {
2216 	ssize_t total = 0;
2217 	int ret;
2218 
2219 	ret = json_mixed_arr_encode(descr, descr_len, val, measure_bytes, &total);
2220 	if (ret < 0) {
2221 		return ret;
2222 	}
2223 
2224 	return total;
2225 }
2226