Commit f5b7448a2732d0e6f39855b98ebca63df2824916
1 parent
5ac6a12e
Extend scope of JSONParser::numberError and rename tokenError
Handle all incomplete token type errors in tokenError.
Showing
1 changed file
with
35 additions
and
23 deletions
libqpdf/JSON.cc
| ... | ... | @@ -607,7 +607,7 @@ namespace |
| 607 | 607 | private: |
| 608 | 608 | void getToken(); |
| 609 | 609 | void handleToken(); |
| 610 | - void numberError(); | |
| 610 | + void tokenError(); | |
| 611 | 611 | static void handle_u_code( |
| 612 | 612 | unsigned long codepoint, |
| 613 | 613 | qpdf_offset_t offset, |
| ... | ... | @@ -721,8 +721,29 @@ JSONParser::handle_u_code( |
| 721 | 721 | } |
| 722 | 722 | |
| 723 | 723 | void |
| 724 | -JSONParser::numberError() | |
| 724 | +JSONParser::tokenError() | |
| 725 | 725 | { |
| 726 | + if (bytes == 0) { | |
| 727 | + QTC::TC("libtests", "JSON parse ls premature end of input"); | |
| 728 | + throw std::runtime_error("JSON: premature end of input"); | |
| 729 | + } | |
| 730 | + if (lex_state == ls_u4) { | |
| 731 | + QTC::TC("libtests", "JSON parse bad hex after u"); | |
| 732 | + throw std::runtime_error( | |
| 733 | + "JSON: offset " + std::to_string(offset - u_count - 1) + | |
| 734 | + ": \\u must be followed by four hex digits"); | |
| 735 | + } else if (lex_state == ls_alpha) { | |
| 736 | + QTC::TC("libtests", "JSON parse keyword bad character"); | |
| 737 | + throw std::runtime_error( | |
| 738 | + "JSON: offset " + std::to_string(offset) + | |
| 739 | + ": keyword: unexpected character " + std::string(p, 1)); | |
| 740 | + } else if (lex_state == ls_backslash) { | |
| 741 | + QTC::TC("libtests", "JSON parse backslash bad character"); | |
| 742 | + throw std::runtime_error( | |
| 743 | + "JSON: offset " + std::to_string(offset) + | |
| 744 | + ": invalid character after backslash: " + std::string(p, 1)); | |
| 745 | + } | |
| 746 | + | |
| 726 | 747 | if (*p == '.') { |
| 727 | 748 | if (lex_state == ls_number || lex_state == ls_number_e || |
| 728 | 749 | lex_state == ls_number_e_sign) { |
| ... | ... | @@ -751,6 +772,7 @@ JSONParser::numberError() |
| 751 | 772 | throw std::runtime_error( |
| 752 | 773 | "JSON: offset " + std::to_string(offset) + |
| 753 | 774 | ": numeric literal: incomplete number"); |
| 775 | + | |
| 754 | 776 | } else { |
| 755 | 777 | QTC::TC("libtests", "JSON parse numeric bad character"); |
| 756 | 778 | throw std::runtime_error( |
| ... | ... | @@ -896,7 +918,7 @@ JSONParser::getToken() |
| 896 | 918 | } else if (*p == 'e' || *p == 'E') { |
| 897 | 919 | lex_state = ls_number_e; |
| 898 | 920 | } else { |
| 899 | - numberError(); | |
| 921 | + tokenError(); | |
| 900 | 922 | } |
| 901 | 923 | break; |
| 902 | 924 | |
| ... | ... | @@ -904,7 +926,7 @@ JSONParser::getToken() |
| 904 | 926 | if ((*p >= '0') && (*p <= '9')) { |
| 905 | 927 | lex_state = ls_number_after_point; |
| 906 | 928 | } else { |
| 907 | - numberError(); | |
| 929 | + tokenError(); | |
| 908 | 930 | } |
| 909 | 931 | break; |
| 910 | 932 | |
| ... | ... | @@ -922,7 +944,7 @@ JSONParser::getToken() |
| 922 | 944 | } else if (*p == 'e' || *p == 'E') { |
| 923 | 945 | lex_state = ls_number_e; |
| 924 | 946 | } else { |
| 925 | - numberError(); | |
| 947 | + tokenError(); | |
| 926 | 948 | } |
| 927 | 949 | break; |
| 928 | 950 | |
| ... | ... | @@ -932,7 +954,7 @@ JSONParser::getToken() |
| 932 | 954 | } else if ((*p == '+') || (*p == '-')) { |
| 933 | 955 | lex_state = ls_number_e_sign; |
| 934 | 956 | } else { |
| 935 | - numberError(); | |
| 957 | + tokenError(); | |
| 936 | 958 | } |
| 937 | 959 | break; |
| 938 | 960 | |
| ... | ... | @@ -940,7 +962,7 @@ JSONParser::getToken() |
| 940 | 962 | if ((*p >= '0') && (*p <= '9')) { |
| 941 | 963 | lex_state = ls_number; |
| 942 | 964 | } else { |
| 943 | - numberError(); | |
| 965 | + tokenError(); | |
| 944 | 966 | } |
| 945 | 967 | break; |
| 946 | 968 | |
| ... | ... | @@ -955,7 +977,7 @@ JSONParser::getToken() |
| 955 | 977 | action = reread; |
| 956 | 978 | ready = true; |
| 957 | 979 | } else { |
| 958 | - numberError(); | |
| 980 | + tokenError(); | |
| 959 | 981 | } |
| 960 | 982 | break; |
| 961 | 983 | |
| ... | ... | @@ -969,10 +991,7 @@ JSONParser::getToken() |
| 969 | 991 | action = reread; |
| 970 | 992 | ready = true; |
| 971 | 993 | } else { |
| 972 | - QTC::TC("libtests", "JSON parse keyword bad character"); | |
| 973 | - throw std::runtime_error( | |
| 974 | - "JSON: offset " + std::to_string(offset) + | |
| 975 | - ": keyword: unexpected character " + std::string(p, 1)); | |
| 994 | + tokenError(); | |
| 976 | 995 | } |
| 977 | 996 | break; |
| 978 | 997 | |
| ... | ... | @@ -1025,11 +1044,8 @@ JSONParser::getToken() |
| 1025 | 1044 | u_value = 0; |
| 1026 | 1045 | break; |
| 1027 | 1046 | default: |
| 1028 | - QTC::TC("libtests", "JSON parse backslash bad character"); | |
| 1029 | - throw std::runtime_error( | |
| 1030 | - "JSON: offset " + std::to_string(offset) + | |
| 1031 | - ": invalid character after backslash: " + | |
| 1032 | - std::string(p, 1)); | |
| 1047 | + lex_state = ls_backslash; | |
| 1048 | + tokenError(); | |
| 1033 | 1049 | } |
| 1034 | 1050 | break; |
| 1035 | 1051 | |
| ... | ... | @@ -1043,10 +1059,7 @@ JSONParser::getToken() |
| 1043 | 1059 | } else if ('A' <= *p && *p <= 'F') { |
| 1044 | 1060 | u_value = 16 * u_value + (10 + ui(*p) - ui('A')); |
| 1045 | 1061 | } else { |
| 1046 | - QTC::TC("libtests", "JSON parse bad hex after u"); | |
| 1047 | - throw std::runtime_error( | |
| 1048 | - "JSON: offset " + std::to_string(offset - u_count - 1) + | |
| 1049 | - ": \\u must be followed by four hex digits"); | |
| 1062 | + tokenError(); | |
| 1050 | 1063 | } |
| 1051 | 1064 | if (++u_count == 4) { |
| 1052 | 1065 | handle_u_code( |
| ... | ... | @@ -1094,8 +1107,7 @@ JSONParser::getToken() |
| 1094 | 1107 | break; |
| 1095 | 1108 | |
| 1096 | 1109 | default: |
| 1097 | - QTC::TC("libtests", "JSON parse ls premature end of input"); | |
| 1098 | - throw std::runtime_error("JSON: premature end of input"); | |
| 1110 | + tokenError(); | |
| 1099 | 1111 | } |
| 1100 | 1112 | } |
| 1101 | 1113 | } | ... | ... |