]> git.ipfire.org Git - thirdparty/json-c.git/commitdiff
Only allow lowercase literals in STRICT mode 112/head
authorAndrea Faulds <ajf@ajf.me>
Thu, 14 Nov 2013 21:13:32 +0000 (21:13 +0000)
committerAndrea Faulds <ajf@ajf.me>
Thu, 14 Nov 2013 21:13:32 +0000 (21:13 +0000)
json_tokener.c
tests/Makefile.am

index a2a598b1a1e01c9885886c284dd7fa31f758916c..7c596032930d3e9f04c6f2a731a15518160de395 100644 (file)
@@ -322,20 +322,26 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
       goto redo_char;
 
     case json_tokener_state_null:
-      printbuf_memappend_fast(tok->pb, &c, 1);
-      if(strncasecmp(json_null_str, tok->pb->buf,
-                    json_min(tok->st_pos+1, (int)strlen(json_null_str))) == 0) {
-       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;
+      {
+       int size;
+       printbuf_memappend_fast(tok->pb, &c, 1);
+       size = json_min(tok->st_pos+1, (int)strlen(json_null_str));
+       if((!(tok->flags & JSON_TOKENER_STRICT) &&
+         strncasecmp(json_null_str, tok->pb->buf, size) == 0)
+         || (strncmp(json_null_str, tok->pb->buf, size) == 0)
+         ) {
+         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->err = json_tokener_error_parse_null;
-       goto out;
+       tok->st_pos++;
       }
-      tok->st_pos++;
       break;
 
     case json_tokener_state_comment_start:
@@ -548,28 +554,36 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
       break;
 
     case json_tokener_state_boolean:
-      printbuf_memappend_fast(tok->pb, &c, 1);
-      if(strncasecmp(json_true_str, tok->pb->buf,
-                    json_min(tok->st_pos+1, (int)strlen(json_true_str))) == 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(strncasecmp(json_false_str, tok->pb->buf,
-                           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;
+      {
+       int size1, size2;
+       printbuf_memappend_fast(tok->pb, &c, 1);
+       size1 = json_min(tok->st_pos+1, (int)strlen(json_true_str));
+       size2 = json_min(tok->st_pos+1, (int)strlen(json_false_str));
+       if((!(tok->flags & JSON_TOKENER_STRICT) &&
+         strncasecmp(json_true_str, tok->pb->buf, size1) == 0)
+         || (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 {
-       tok->err = json_tokener_error_parse_boolean;
-       goto out;
+       tok->st_pos++;
       }
-      tok->st_pos++;
       break;
 
     case json_tokener_state_number:
index c6123ed1f3962b7318b8877935eee7c0c0390242..4fb3cb8a86c974d206ecf9c2f99fb3463d22c4bf 100644 (file)
@@ -12,6 +12,7 @@ check_PROGRAMS += test_null
 check_PROGRAMS += test_cast
 check_PROGRAMS += test_parse
 check_PROGRAMS += test_locale
+check_PROGRAMS += test_case
 
 test1_LDADD = $(LIBJSON_LA)
 
@@ -39,7 +40,9 @@ test_parse_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
 check_PROGRAMS+=test_printbuf