Skip to content

Commit 6bfab90

Browse files
committed
Issue json-c#867: disallow control characters in strict mode.
1 parent ecb7a4c commit 6bfab90

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

json_tokener.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,12 @@ struct json_object *json_tokener_parse_ex(struct json_tokener *tok, const char *
678678
state = json_tokener_state_string_escape;
679679
break;
680680
}
681+
else if ((tok->flags & JSON_TOKENER_STRICT) && c <= 0x1f)
682+
{
683+
// Disallow control characters in strict mode
684+
tok->err = json_tokener_error_parse_string;
685+
goto out;
686+
}
681687
if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok))
682688
{
683689
printbuf_memappend_checked(tok->pb, case_start,

tests/test_parse.c

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ struct incremental_step
535535
{"{\"a\":}", -1, 5, json_tokener_error_parse_unexpected, 1, 0},
536536
{"{\"a\":1,\"a\":2}", -1, -1, json_tokener_success, 1, 0},
537537
{"\"a\":1}", -1, 3, json_tokener_success, 1, 0},
538-
{"{\"a\":1", -1, -1, json_tokener_continue, 1, 0},
538+
{"{\"a\":1", -1, -1, json_tokener_continue, 1, 0}, //}
539539
{"[,]", -1, 1, json_tokener_error_parse_unexpected, 1, 0},
540540
{"[,1]", -1, 1, json_tokener_error_parse_unexpected, 1, 0},
541541

@@ -595,6 +595,44 @@ struct incremental_step
595595
{"\x7b\x22\x31\x81\x22\x3a\x31\x7d", -1, 3, json_tokener_error_parse_utf8_string, 1,
596596
JSON_TOKENER_VALIDATE_UTF8},
597597

598+
// Note, current asciiz APIs can't parse \x00, skip it
599+
{ "\"0\x01\x02\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" \
600+
"\x10\x11\x12\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\"",
601+
-1, -1, json_tokener_success, 1, 0 },
602+
603+
// Test control chars again, this time in strict mode, which should fail
604+
{ "\"\x01\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
605+
{ "\"\x02\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
606+
{ "\"\x03\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
607+
{ "\"\x04\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
608+
{ "\"\x05\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
609+
{ "\"\x06\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
610+
{ "\"\x07\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
611+
{ "\"\x08\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
612+
{ "\"\x09\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
613+
{ "\"\x0a\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
614+
{ "\"\x0b\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
615+
{ "\"\x0c\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
616+
{ "\"\x0d\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
617+
{ "\"\x0e\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
618+
{ "\"\x0f\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
619+
{ "\"\x10\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
620+
{ "\"\x11\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
621+
{ "\"\x12\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
622+
{ "\"\x13\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
623+
{ "\"\x14\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
624+
{ "\"\x15\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
625+
{ "\"\x16\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
626+
{ "\"\x17\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
627+
{ "\"\x18\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
628+
{ "\"\x19\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
629+
{ "\"\x1a\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
630+
{ "\"\x1b\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
631+
{ "\"\x1c\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
632+
{ "\"\x1d\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
633+
{ "\"\x1e\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
634+
{ "\"\x1f\"", -1, 1, json_tokener_error_parse_string, 1, JSON_TOKENER_STRICT },
635+
598636
{NULL, -1, -1, json_tokener_success, 0, 0},
599637
};
600638

0 commit comments

Comments
 (0)