Commit 08e768909d9760a3588b8a8eaaeda0b357a85c62

Authored by m-holger
1 parent cba1c352

In JSONParser add lex_state ls_number_leading_zero

libqpdf/JSON.cc
@@ -648,6 +648,7 @@ namespace @@ -648,6 +648,7 @@ namespace
648 ls_top, 648 ls_top,
649 ls_number, 649 ls_number,
650 ls_number_minus, 650 ls_number_minus,
  651 + ls_number_leading_zero,
651 ls_alpha, 652 ls_alpha,
652 ls_string, 653 ls_string,
653 ls_backslash, 654 ls_backslash,
@@ -868,13 +869,20 @@ JSONParser::getToken() @@ -868,13 +869,20 @@ JSONParser::getToken()
868 number_after_e = 0; 869 number_after_e = 0;
869 number_saw_point = false; 870 number_saw_point = false;
870 number_saw_e = false; 871 number_saw_e = false;
871 - } else if ((*p >= '0') && (*p <= '9')) { 872 + } else if ((*p >= '1') && (*p <= '9')) {
872 lex_state = ls_number; 873 lex_state = ls_number;
873 number_before_point = 1; 874 number_before_point = 1;
874 number_after_point = 0; 875 number_after_point = 0;
875 number_after_e = 0; 876 number_after_e = 0;
876 number_saw_point = false; 877 number_saw_point = false;
877 number_saw_e = false; 878 number_saw_e = false;
  879 + } else if (*p == '0') {
  880 + lex_state = ls_number_leading_zero;
  881 + number_before_point = 1;
  882 + number_after_point = 0;
  883 + number_after_e = 0;
  884 + number_saw_point = false;
  885 + number_saw_e = false;
878 } else if (*p == '.') { 886 } else if (*p == '.') {
879 lex_state = ls_number; 887 lex_state = ls_number;
880 number_before_point = 0; 888 number_before_point = 0;
@@ -898,7 +906,7 @@ JSONParser::getToken() @@ -898,7 +906,7 @@ JSONParser::getToken()
898 lex_state = ls_number; 906 lex_state = ls_number;
899 } else if (*p == '0') { 907 } else if (*p == '0') {
900 ++number_before_point; 908 ++number_before_point;
901 - lex_state = ls_number; 909 + lex_state = ls_number_leading_zero;
902 } else { 910 } else {
903 QTC::TC("libtests", "JSON parse number minus no digits"); 911 QTC::TC("libtests", "JSON parse number minus no digits");
904 throw std::runtime_error( 912 throw std::runtime_error(
@@ -907,6 +915,25 @@ JSONParser::getToken() @@ -907,6 +915,25 @@ JSONParser::getToken()
907 } 915 }
908 break; 916 break;
909 917
  918 + case ls_number_leading_zero:
  919 + if (*p == '.') {
  920 + lex_state = ls_number;
  921 + } else if (*p == 'e') {
  922 + lex_state = ls_number;
  923 + } else if (QUtil::is_space(*p)) {
  924 + action = ignore;
  925 + ready = true;
  926 + } else if (strchr("{}[]:,", *p)) {
  927 + action = reread;
  928 + ready = true;
  929 + } else {
  930 + QTC::TC("libtests", "JSON parse leading zero");
  931 + throw std::runtime_error(
  932 + "JSON: offset " + std::to_string(offset) +
  933 + ": number with leading zero");
  934 + }
  935 + break;
  936 +
910 case ls_number: 937 case ls_number:
911 if ((*p >= '0') && (*p <= '9')) { 938 if ((*p >= '0') && (*p <= '9')) {
912 if (number_saw_e) { 939 if (number_saw_e) {
@@ -1037,6 +1064,7 @@ JSONParser::getToken() @@ -1037,6 +1064,7 @@ JSONParser::getToken()
1037 1064
1038 case ls_number: 1065 case ls_number:
1039 case ls_number_minus: 1066 case ls_number_minus:
  1067 + case ls_number_leading_zero:
1040 case ls_alpha: 1068 case ls_alpha:
1041 // okay 1069 // okay
1042 break; 1070 break;
@@ -1111,6 +1139,7 @@ JSONParser::handleToken() @@ -1111,6 +1139,7 @@ JSONParser::handleToken()
1111 1139
1112 case ls_number: 1140 case ls_number:
1113 case ls_number_minus: 1141 case ls_number_minus:
  1142 + case ls_number_leading_zero:
1114 if (number_saw_point && (number_after_point == 0)) { 1143 if (number_saw_point && (number_after_point == 0)) {
1115 // QTC::TC("libtests", "JSON parse decimal with no digits"); 1144 // QTC::TC("libtests", "JSON parse decimal with no digits");
1116 throw std::runtime_error( 1145 throw std::runtime_error(
@@ -1120,7 +1149,6 @@ JSONParser::handleToken() @@ -1120,7 +1149,6 @@ JSONParser::handleToken()
1120 if ((number_before_point > 1) && 1149 if ((number_before_point > 1) &&
1121 ((first_char == '0') || 1150 ((first_char == '0') ||
1122 ((first_char == '-') && (token.at(1) == '0')))) { 1151 ((first_char == '-') && (token.at(1) == '0')))) {
1123 - QTC::TC("libtests", "JSON parse leading zero");  
1124 throw std::runtime_error( 1152 throw std::runtime_error(
1125 "JSON: offset " + std::to_string(offset) + 1153 "JSON: offset " + std::to_string(offset) +
1126 ": number with leading zero"); 1154 ": number with leading zero");
libtests/qtest/json_parse/bad-32.out
1 -exception: bad-32.json: JSON: offset 5: number with leading zero 1 +exception: bad-32.json: JSON: offset 1: number with leading zero
libtests/qtest/json_parse/bad-33.out
1 -exception: bad-33.json: JSON: offset 6: number with leading zero 1 +exception: bad-33.json: JSON: offset 2: number with leading zero