Commit cba1c352e3c4236205dc96de643e780abb3c7b64
1 parent
b6b4d3b2
In JSONParser add lex_state ls_number_minus
Showing
8 changed files
with
30 additions
and
6 deletions
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
libtests/qtest/json_parse/bad-31.out
libtests/qtest/json_parse/bad-41.json
0 → 100644
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 | ... | ... |