Commit 6ea543e6c731db30b0807f531a445a66c66619b9

Authored by m-holger
1 parent 04333bbc

In JSONParser add lex_state ls_number_e_sign

libqpdf/JSON.cc
@@ -653,6 +653,7 @@ namespace @@ -653,6 +653,7 @@ namespace
653 ls_number_point, 653 ls_number_point,
654 ls_number_after_point, 654 ls_number_after_point,
655 ls_number_e, 655 ls_number_e,
  656 + ls_number_e_sign,
656 ls_alpha, 657 ls_alpha,
657 ls_string, 658 ls_string,
658 ls_backslash, 659 ls_backslash,
@@ -988,6 +989,14 @@ JSONParser::getToken() @@ -988,6 +989,14 @@ JSONParser::getToken()
988 ++number_after_e; 989 ++number_after_e;
989 lex_state = ls_number; 990 lex_state = ls_number;
990 } else if ((*p == '+') || (*p == '-')) { 991 } else if ((*p == '+') || (*p == '-')) {
  992 + lex_state = ls_number_e_sign;
  993 + } else {
  994 + numberError();
  995 + }
  996 + break;
  997 +
  998 + case ls_number_e_sign:
  999 + if ((*p >= '0') && (*p <= '9')) {
991 lex_state = ls_number; 1000 lex_state = ls_number;
992 } else { 1001 } else {
993 numberError(); 1002 numberError();
@@ -1120,13 +1129,14 @@ JSONParser::getToken() @@ -1120,13 +1129,14 @@ JSONParser::getToken()
1120 throw std::logic_error("tok_start set in ls_top while parsing"); 1129 throw std::logic_error("tok_start set in ls_top while parsing");
1121 break; 1130 break;
1122 1131
  1132 + case ls_number:
  1133 + case ls_number_minus:
  1134 + case ls_number_leading_zero:
1123 case ls_number_before_point: 1135 case ls_number_before_point:
1124 case ls_number_point: 1136 case ls_number_point:
1125 case ls_number_after_point: 1137 case ls_number_after_point:
1126 case ls_number_e: 1138 case ls_number_e:
1127 - case ls_number:  
1128 - case ls_number_minus:  
1129 - case ls_number_leading_zero: 1139 + case ls_number_e_sign:
1130 case ls_alpha: 1140 case ls_alpha:
1131 // okay 1141 // okay
1132 break; 1142 break;
@@ -1206,6 +1216,7 @@ JSONParser::handleToken() @@ -1206,6 +1216,7 @@ JSONParser::handleToken()
1206 case ls_number_point: 1216 case ls_number_point:
1207 case ls_number_after_point: 1217 case ls_number_after_point:
1208 case ls_number_e: 1218 case ls_number_e:
  1219 + case ls_number_e_sign:
1209 if (number_saw_point && (number_after_point == 0)) { 1220 if (number_saw_point && (number_after_point == 0)) {
1210 // QTC::TC("libtests", "JSON parse decimal with no digits"); 1221 // QTC::TC("libtests", "JSON parse decimal with no digits");
1211 throw std::runtime_error( 1222 throw std::runtime_error(
libtests/qtest/json_parse.test
@@ -123,6 +123,8 @@ my @bad = ( @@ -123,6 +123,8 @@ my @bad = (
123 "duplicate dictionary key", # 40 123 "duplicate dictionary key", # 40
124 "decimal point after minus",# 41 124 "decimal point after minus",# 41
125 "e after minus", # 42 125 "e after minus", # 42
  126 + "missing digit after e", # 43
  127 + "missing digit after e+/-", # 44
126 ); 128 );
127 129
128 my $i = 0; 130 my $i = 0;
libtests/qtest/json_parse/bad-43.json 0 → 100644
  1 +123e
libtests/qtest/json_parse/bad-43.out 0 → 100644
  1 +exception: bad-43.json: JSON: offset 4: numeric literal: incomplete number
libtests/qtest/json_parse/bad-44.json 0 → 100644
  1 +123e+
libtests/qtest/json_parse/bad-44.out 0 → 100644
  1 +exception: bad-44.json: JSON: offset 5: numeric literal: incomplete number