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 648 ls_top,
649 649 ls_number,
650 650 ls_number_minus,
  651 + ls_number_leading_zero,
651 652 ls_alpha,
652 653 ls_string,
653 654 ls_backslash,
... ... @@ -868,13 +869,20 @@ JSONParser::getToken()
868 869 number_after_e = 0;
869 870 number_saw_point = false;
870 871 number_saw_e = false;
871   - } else if ((*p >= '0') && (*p <= '9')) {
  872 + } else if ((*p >= '1') && (*p <= '9')) {
872 873 lex_state = ls_number;
873 874 number_before_point = 1;
874 875 number_after_point = 0;
875 876 number_after_e = 0;
876 877 number_saw_point = false;
877 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 886 } else if (*p == '.') {
879 887 lex_state = ls_number;
880 888 number_before_point = 0;
... ... @@ -898,7 +906,7 @@ JSONParser::getToken()
898 906 lex_state = ls_number;
899 907 } else if (*p == '0') {
900 908 ++number_before_point;
901   - lex_state = ls_number;
  909 + lex_state = ls_number_leading_zero;
902 910 } else {
903 911 QTC::TC("libtests", "JSON parse number minus no digits");
904 912 throw std::runtime_error(
... ... @@ -907,6 +915,25 @@ JSONParser::getToken()
907 915 }
908 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 937 case ls_number:
911 938 if ((*p >= '0') && (*p <= '9')) {
912 939 if (number_saw_e) {
... ... @@ -1037,6 +1064,7 @@ JSONParser::getToken()
1037 1064  
1038 1065 case ls_number:
1039 1066 case ls_number_minus:
  1067 + case ls_number_leading_zero:
1040 1068 case ls_alpha:
1041 1069 // okay
1042 1070 break;
... ... @@ -1111,6 +1139,7 @@ JSONParser::handleToken()
1111 1139  
1112 1140 case ls_number:
1113 1141 case ls_number_minus:
  1142 + case ls_number_leading_zero:
1114 1143 if (number_saw_point && (number_after_point == 0)) {
1115 1144 // QTC::TC("libtests", "JSON parse decimal with no digits");
1116 1145 throw std::runtime_error(
... ... @@ -1120,7 +1149,6 @@ JSONParser::handleToken()
1120 1149 if ((number_before_point > 1) &&
1121 1150 ((first_char == '0') ||
1122 1151 ((first_char == '-') && (token.at(1) == '0')))) {
1123   - QTC::TC("libtests", "JSON parse leading zero");
1124 1152 throw std::runtime_error(
1125 1153 "JSON: offset " + std::to_string(offset) +
1126 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
... ...