Commit cba1c352e3c4236205dc96de643e780abb3c7b64

Authored by m-holger
1 parent b6b4d3b2

In JSONParser add lex_state ls_number_minus

libqpdf/JSON.cc
@@ -647,6 +647,7 @@ namespace @@ -647,6 +647,7 @@ namespace
647 enum lex_state_e { 647 enum lex_state_e {
648 ls_top, 648 ls_top,
649 ls_number, 649 ls_number,
  650 + ls_number_minus,
650 ls_alpha, 651 ls_alpha,
651 ls_string, 652 ls_string,
652 ls_backslash, 653 ls_backslash,
@@ -861,7 +862,7 @@ JSONParser::getToken() @@ -861,7 +862,7 @@ JSONParser::getToken()
861 } else if ((*p >= 'a') && (*p <= 'z')) { 862 } else if ((*p >= 'a') && (*p <= 'z')) {
862 lex_state = ls_alpha; 863 lex_state = ls_alpha;
863 } else if (*p == '-') { 864 } else if (*p == '-') {
864 - lex_state = ls_number; 865 + lex_state = ls_number_minus;
865 number_before_point = 0; 866 number_before_point = 0;
866 number_after_point = 0; 867 number_after_point = 0;
867 number_after_e = 0; 868 number_after_e = 0;
@@ -891,6 +892,21 @@ JSONParser::getToken() @@ -891,6 +892,21 @@ JSONParser::getToken()
891 } 892 }
892 break; 893 break;
893 894
  895 + case ls_number_minus:
  896 + if ((*p >= '1') && (*p <= '9')) {
  897 + ++number_before_point;
  898 + lex_state = ls_number;
  899 + } else if (*p == '0') {
  900 + ++number_before_point;
  901 + lex_state = ls_number;
  902 + } else {
  903 + QTC::TC("libtests", "JSON parse number minus no digits");
  904 + throw std::runtime_error(
  905 + "JSON: offset " + std::to_string(offset) +
  906 + ": numeric literal: no digit after minus sign");
  907 + }
  908 + break;
  909 +
894 case ls_number: 910 case ls_number:
895 if ((*p >= '0') && (*p <= '9')) { 911 if ((*p >= '0') && (*p <= '9')) {
896 if (number_saw_e) { 912 if (number_saw_e) {
@@ -1020,6 +1036,7 @@ JSONParser::getToken() @@ -1020,6 +1036,7 @@ JSONParser::getToken()
1020 break; 1036 break;
1021 1037
1022 case ls_number: 1038 case ls_number:
  1039 + case ls_number_minus:
1023 case ls_alpha: 1040 case ls_alpha:
1024 // okay 1041 // okay
1025 break; 1042 break;
@@ -1093,8 +1110,9 @@ JSONParser::handleToken() @@ -1093,8 +1110,9 @@ JSONParser::handleToken()
1093 break; 1110 break;
1094 1111
1095 case ls_number: 1112 case ls_number:
  1113 + case ls_number_minus:
1096 if (number_saw_point && (number_after_point == 0)) { 1114 if (number_saw_point && (number_after_point == 0)) {
1097 - QTC::TC("libtests", "JSON parse decimal with no digits"); 1115 + // QTC::TC("libtests", "JSON parse decimal with no digits");
1098 throw std::runtime_error( 1116 throw std::runtime_error(
1099 "JSON: offset " + std::to_string(offset) + 1117 "JSON: offset " + std::to_string(offset) +
1100 ": decimal point with no digits"); 1118 ": decimal point with no digits");
@@ -1108,7 +1126,7 @@ JSONParser::handleToken() @@ -1108,7 +1126,7 @@ JSONParser::handleToken()
1108 ": number with leading zero"); 1126 ": number with leading zero");
1109 } 1127 }
1110 if ((number_before_point == 0) && (number_after_point == 0)) { 1128 if ((number_before_point == 0) && (number_after_point == 0)) {
1111 - QTC::TC("libtests", "JSON parse number no digits"); 1129 + // QTC::TC("libtests", "JSON parse number no digits");
1112 throw std::runtime_error( 1130 throw std::runtime_error(
1113 "JSON: offset " + std::to_string(offset) + 1131 "JSON: offset " + std::to_string(offset) +
1114 ": number with no digits"); 1132 ": number with no digits");
libtests/libtests.testcov
@@ -58,7 +58,6 @@ QPDFArgParser bad option for help 0 @@ -58,7 +58,6 @@ QPDFArgParser bad option for help 0
58 QPDFArgParser bad topic for help 0 58 QPDFArgParser bad topic for help 0
59 QPDFArgParser invalid choice handler to unknown 0 59 QPDFArgParser invalid choice handler to unknown 0
60 JSON parse junk after object 0 60 JSON parse junk after object 0
61 -JSON parse decimal with no digits 0  
62 JSON parse invalid keyword 0 61 JSON parse invalid keyword 0
63 JSON parse expected colon 0 62 JSON parse expected colon 0
64 JSON parse expected , or } 0 63 JSON parse expected , or } 0
@@ -76,11 +75,11 @@ JSON parse duplicate point 0 @@ -76,11 +75,11 @@ JSON parse duplicate point 0
76 JSON parse duplicate e 0 75 JSON parse duplicate e 0
77 JSON parse unexpected sign 0 76 JSON parse unexpected sign 0
78 JSON parse numeric bad character 0 77 JSON parse numeric bad character 0
  78 +JSON parse number minus no digits 0
79 JSON parse keyword bad character 0 79 JSON parse keyword bad character 0
80 JSON parse backslash bad character 0 80 JSON parse backslash bad character 0
81 JSON parse unterminated string 0 81 JSON parse unterminated string 0
82 JSON parse leading zero 0 82 JSON parse leading zero 0
83 -JSON parse number no digits 0  
84 JSON parse premature end of u 0 83 JSON parse premature end of u 0
85 JSON parse bad hex after u 0 84 JSON parse bad hex after u 0
86 JSONHandler unhandled value 0 85 JSONHandler unhandled value 0
libtests/qtest/json_parse.test
@@ -121,6 +121,8 @@ my @bad = ( @@ -121,6 +121,8 @@ my @bad = (
121 "high high surrogate", # 38 121 "high high surrogate", # 38
122 "dangling high surrogate", # 39 122 "dangling high surrogate", # 39
123 "duplicate dictionary key", # 40 123 "duplicate dictionary key", # 40
  124 + "decimal point after minus",# 41
  125 + "e after minus", # 42
124 ); 126 );
125 127
126 my $i = 0; 128 my $i = 0;
libtests/qtest/json_parse/bad-31.out
1 -exception: bad-31.json: JSON: offset 2: number with no digits 1 +exception: bad-31.json: JSON: offset 1: numeric literal: no digit after minus sign
libtests/qtest/json_parse/bad-41.json 0 → 100644
  1 +-.123
  2 +
libtests/qtest/json_parse/bad-41.out 0 → 100644
  1 +exception: bad-41.json: JSON: offset 1: numeric literal: no digit after minus sign
libtests/qtest/json_parse/bad-42.json 0 → 100644
  1 +-e123
libtests/qtest/json_parse/bad-42.out 0 → 100644
  1 +exception: bad-42.json: JSON: offset 1: numeric literal: no digit after minus sign