Commit 04333bbc201963a8e716c5949bad071ea6c1a2fe
1 parent
972ebca5
In JSONParser add lex_state ls_number_e
Also, allow 'E' as alternative to 'e'.
Showing
1 changed file
with
25 additions
and
10 deletions
libqpdf/JSON.cc
| ... | ... | @@ -652,6 +652,7 @@ namespace |
| 652 | 652 | ls_number_before_point, |
| 653 | 653 | ls_number_point, |
| 654 | 654 | ls_number_after_point, |
| 655 | + ls_number_e, | |
| 655 | 656 | ls_alpha, |
| 656 | 657 | ls_string, |
| 657 | 658 | ls_backslash, |
| ... | ... | @@ -817,7 +818,7 @@ JSONParser::numberError() |
| 817 | 818 | "JSON: offset " + std::to_string(offset) + |
| 818 | 819 | ": numeric literal: decimal point already seen"); |
| 819 | 820 | } |
| 820 | - } else if (*p == 'e') { | |
| 821 | + } else if (*p == 'e' || *p == 'E') { | |
| 821 | 822 | // QTC::TC("libtests", "JSON parse duplicate e"); |
| 822 | 823 | throw std::runtime_error( |
| 823 | 824 | "JSON: offset " + std::to_string(offset) + |
| ... | ... | @@ -919,14 +920,15 @@ JSONParser::getToken() |
| 919 | 920 | case ls_number_leading_zero: |
| 920 | 921 | if (*p == '.') { |
| 921 | 922 | lex_state = ls_number_point; |
| 922 | - } else if (*p == 'e') { | |
| 923 | - lex_state = ls_number; | |
| 924 | 923 | } else if (QUtil::is_space(*p)) { |
| 925 | 924 | action = ignore; |
| 926 | 925 | ready = true; |
| 927 | 926 | } else if (strchr("{}[]:,", *p)) { |
| 928 | 927 | action = reread; |
| 929 | 928 | ready = true; |
| 929 | + } else if (*p == 'e' || *p == 'E') { | |
| 930 | + number_saw_e = true; | |
| 931 | + lex_state = ls_number_e; | |
| 930 | 932 | } else { |
| 931 | 933 | QTC::TC("libtests", "JSON parse leading zero"); |
| 932 | 934 | throw std::runtime_error( |
| ... | ... | @@ -941,15 +943,15 @@ JSONParser::getToken() |
| 941 | 943 | } else if (*p == '.') { |
| 942 | 944 | number_saw_point = true; |
| 943 | 945 | lex_state = ls_number_point; |
| 944 | - } else if (*p == 'e') { | |
| 945 | - number_saw_e = true; | |
| 946 | - lex_state = ls_number; | |
| 947 | 946 | } else if (QUtil::is_space(*p)) { |
| 948 | 947 | action = ignore; |
| 949 | 948 | ready = true; |
| 950 | 949 | } else if (strchr("{}[]:,", *p)) { |
| 951 | 950 | action = reread; |
| 952 | 951 | ready = true; |
| 952 | + } else if (*p == 'e' || *p == 'E') { | |
| 953 | + number_saw_e = true; | |
| 954 | + lex_state = ls_number_e; | |
| 953 | 955 | } else { |
| 954 | 956 | numberError(); |
| 955 | 957 | } |
| ... | ... | @@ -967,15 +969,26 @@ JSONParser::getToken() |
| 967 | 969 | case ls_number_after_point: |
| 968 | 970 | if ((*p >= '0') && (*p <= '9')) { |
| 969 | 971 | ++number_after_point; |
| 970 | - } else if (*p == 'e') { | |
| 971 | - number_saw_e = true; | |
| 972 | - lex_state = ls_number; | |
| 973 | 972 | } else if (QUtil::is_space(*p)) { |
| 974 | 973 | action = ignore; |
| 975 | 974 | ready = true; |
| 976 | 975 | } else if (strchr("{}[]:,", *p)) { |
| 977 | 976 | action = reread; |
| 978 | 977 | ready = true; |
| 978 | + } else if (*p == 'e' || *p == 'E') { | |
| 979 | + number_saw_e = true; | |
| 980 | + lex_state = ls_number_e; | |
| 981 | + } else { | |
| 982 | + numberError(); | |
| 983 | + } | |
| 984 | + break; | |
| 985 | + | |
| 986 | + case ls_number_e: | |
| 987 | + if ((*p >= '0') && (*p <= '9')) { | |
| 988 | + ++number_after_e; | |
| 989 | + lex_state = ls_number; | |
| 990 | + } else if ((*p == '+') || (*p == '-')) { | |
| 991 | + lex_state = ls_number; | |
| 979 | 992 | } else { |
| 980 | 993 | numberError(); |
| 981 | 994 | } |
| ... | ... | @@ -1003,7 +1016,7 @@ JSONParser::getToken() |
| 1003 | 1016 | } else { |
| 1004 | 1017 | number_saw_point = true; |
| 1005 | 1018 | } |
| 1006 | - } else if (*p == 'e') { | |
| 1019 | + } else if (*p == 'e' || *p == 'E') { | |
| 1007 | 1020 | if (number_saw_e) { |
| 1008 | 1021 | QTC::TC("libtests", "JSON parse duplicate e"); |
| 1009 | 1022 | throw std::runtime_error( |
| ... | ... | @@ -1110,6 +1123,7 @@ JSONParser::getToken() |
| 1110 | 1123 | case ls_number_before_point: |
| 1111 | 1124 | case ls_number_point: |
| 1112 | 1125 | case ls_number_after_point: |
| 1126 | + case ls_number_e: | |
| 1113 | 1127 | case ls_number: |
| 1114 | 1128 | case ls_number_minus: |
| 1115 | 1129 | case ls_number_leading_zero: |
| ... | ... | @@ -1191,6 +1205,7 @@ JSONParser::handleToken() |
| 1191 | 1205 | case ls_number_before_point: |
| 1192 | 1206 | case ls_number_point: |
| 1193 | 1207 | case ls_number_after_point: |
| 1208 | + case ls_number_e: | |
| 1194 | 1209 | if (number_saw_point && (number_after_point == 0)) { |
| 1195 | 1210 | // QTC::TC("libtests", "JSON parse decimal with no digits"); |
| 1196 | 1211 | throw std::runtime_error( | ... | ... |