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