Only allow lowercase literals in STRICT mode

This commit is contained in:
Andrea Faulds
2013-11-14 21:13:32 +00:00
parent 06450206c4
commit bda0540cb9
2 changed files with 50 additions and 33 deletions

View File

@@ -322,20 +322,26 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
goto redo_char; goto redo_char;
case json_tokener_state_null: case json_tokener_state_null:
printbuf_memappend_fast(tok->pb, &c, 1); {
if(strncasecmp(json_null_str, tok->pb->buf, int size;
json_min(tok->st_pos+1, (int)strlen(json_null_str))) == 0) { printbuf_memappend_fast(tok->pb, &c, 1);
if(tok->st_pos == (int)strlen(json_null_str)) { size = json_min(tok->st_pos+1, (int)strlen(json_null_str));
current = NULL; if((!(tok->flags & JSON_TOKENER_STRICT) &&
saved_state = json_tokener_state_finish; strncasecmp(json_null_str, tok->pb->buf, size) == 0)
state = json_tokener_state_eatws; || (strncmp(json_null_str, tok->pb->buf, size) == 0)
goto redo_char; ) {
if(tok->st_pos == (int)strlen(json_null_str)) {
current = NULL;
saved_state = json_tokener_state_finish;
state = json_tokener_state_eatws;
goto redo_char;
}
} else {
tok->err = json_tokener_error_parse_null;
goto out;
} }
} else { tok->st_pos++;
tok->err = json_tokener_error_parse_null;
goto out;
} }
tok->st_pos++;
break; break;
case json_tokener_state_comment_start: case json_tokener_state_comment_start:
@@ -548,28 +554,36 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
break; break;
case json_tokener_state_boolean: case json_tokener_state_boolean:
printbuf_memappend_fast(tok->pb, &c, 1); {
if(strncasecmp(json_true_str, tok->pb->buf, int size1, size2;
json_min(tok->st_pos+1, (int)strlen(json_true_str))) == 0) { printbuf_memappend_fast(tok->pb, &c, 1);
if(tok->st_pos == (int)strlen(json_true_str)) { size1 = json_min(tok->st_pos+1, (int)strlen(json_true_str));
current = json_object_new_boolean(1); size2 = json_min(tok->st_pos+1, (int)strlen(json_false_str));
saved_state = json_tokener_state_finish; if((!(tok->flags & JSON_TOKENER_STRICT) &&
state = json_tokener_state_eatws; strncasecmp(json_true_str, tok->pb->buf, size1) == 0)
goto redo_char; || (strncmp(json_true_str, tok->pb->buf, size1) == 0)
) {
if(tok->st_pos == (int)strlen(json_true_str)) {
current = json_object_new_boolean(1);
saved_state = json_tokener_state_finish;
state = json_tokener_state_eatws;
goto redo_char;
}
} else if((!(tok->flags & JSON_TOKENER_STRICT) &&
strncasecmp(json_false_str, tok->pb->buf, size2) == 0)
|| (strncmp(json_false_str, tok->pb->buf, size2) == 0)) {
if(tok->st_pos == (int)strlen(json_false_str)) {
current = json_object_new_boolean(0);
saved_state = json_tokener_state_finish;
state = json_tokener_state_eatws;
goto redo_char;
}
} else {
tok->err = json_tokener_error_parse_boolean;
goto out;
} }
} else if(strncasecmp(json_false_str, tok->pb->buf, tok->st_pos++;
json_min(tok->st_pos+1, (int)strlen(json_false_str))) == 0) {
if(tok->st_pos == (int)strlen(json_false_str)) {
current = json_object_new_boolean(0);
saved_state = json_tokener_state_finish;
state = json_tokener_state_eatws;
goto redo_char;
}
} else {
tok->err = json_tokener_error_parse_boolean;
goto out;
} }
tok->st_pos++;
break; break;
case json_tokener_state_number: case json_tokener_state_number:

View File

@@ -12,6 +12,7 @@ check_PROGRAMS += test_null
check_PROGRAMS += test_cast check_PROGRAMS += test_cast
check_PROGRAMS += test_parse check_PROGRAMS += test_parse
check_PROGRAMS += test_locale check_PROGRAMS += test_locale
check_PROGRAMS += test_case
test1_LDADD = $(LIBJSON_LA) test1_LDADD = $(LIBJSON_LA)
@@ -39,7 +40,9 @@ test_parse_LDADD = $(LIBJSON_LA)
test_locale_LDADD = $(LIBJSON_LA) test_locale_LDADD = $(LIBJSON_LA)
TESTS = test1.test test2.test test4.test testReplaceExisting.test parse_int64.test test_null.test test_cast.test test_parse.test test_locale.test test_case_LDADD = $(LIBJSON_LA)
TESTS = test1.test test2.test test4.test testReplaceExisting.test parse_int64.test test_null.test test_cast.test test_parse.test test_locale.test test_case.test
TESTS+= test_printbuf.test TESTS+= test_printbuf.test
check_PROGRAMS+=test_printbuf check_PROGRAMS+=test_printbuf