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,7 +607,7 @@ namespace | ||
| 607 | private: | 607 | private: |
| 608 | void getToken(); | 608 | void getToken(); |
| 609 | void handleToken(); | 609 | void handleToken(); |
| 610 | - void numberError(); | 610 | + void tokenError(); |
| 611 | static void handle_u_code( | 611 | static void handle_u_code( |
| 612 | unsigned long codepoint, | 612 | unsigned long codepoint, |
| 613 | qpdf_offset_t offset, | 613 | qpdf_offset_t offset, |
| @@ -721,8 +721,29 @@ JSONParser::handle_u_code( | @@ -721,8 +721,29 @@ JSONParser::handle_u_code( | ||
| 721 | } | 721 | } |
| 722 | 722 | ||
| 723 | void | 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 | if (*p == '.') { | 747 | if (*p == '.') { |
| 727 | if (lex_state == ls_number || lex_state == ls_number_e || | 748 | if (lex_state == ls_number || lex_state == ls_number_e || |
| 728 | lex_state == ls_number_e_sign) { | 749 | lex_state == ls_number_e_sign) { |
| @@ -751,6 +772,7 @@ JSONParser::numberError() | @@ -751,6 +772,7 @@ JSONParser::numberError() | ||
| 751 | throw std::runtime_error( | 772 | throw std::runtime_error( |
| 752 | "JSON: offset " + std::to_string(offset) + | 773 | "JSON: offset " + std::to_string(offset) + |
| 753 | ": numeric literal: incomplete number"); | 774 | ": numeric literal: incomplete number"); |
| 775 | + | ||
| 754 | } else { | 776 | } else { |
| 755 | QTC::TC("libtests", "JSON parse numeric bad character"); | 777 | QTC::TC("libtests", "JSON parse numeric bad character"); |
| 756 | throw std::runtime_error( | 778 | throw std::runtime_error( |
| @@ -896,7 +918,7 @@ JSONParser::getToken() | @@ -896,7 +918,7 @@ JSONParser::getToken() | ||
| 896 | } else if (*p == 'e' || *p == 'E') { | 918 | } else if (*p == 'e' || *p == 'E') { |
| 897 | lex_state = ls_number_e; | 919 | lex_state = ls_number_e; |
| 898 | } else { | 920 | } else { |
| 899 | - numberError(); | 921 | + tokenError(); |
| 900 | } | 922 | } |
| 901 | break; | 923 | break; |
| 902 | 924 | ||
| @@ -904,7 +926,7 @@ JSONParser::getToken() | @@ -904,7 +926,7 @@ JSONParser::getToken() | ||
| 904 | if ((*p >= '0') && (*p <= '9')) { | 926 | if ((*p >= '0') && (*p <= '9')) { |
| 905 | lex_state = ls_number_after_point; | 927 | lex_state = ls_number_after_point; |
| 906 | } else { | 928 | } else { |
| 907 | - numberError(); | 929 | + tokenError(); |
| 908 | } | 930 | } |
| 909 | break; | 931 | break; |
| 910 | 932 | ||
| @@ -922,7 +944,7 @@ JSONParser::getToken() | @@ -922,7 +944,7 @@ JSONParser::getToken() | ||
| 922 | } else if (*p == 'e' || *p == 'E') { | 944 | } else if (*p == 'e' || *p == 'E') { |
| 923 | lex_state = ls_number_e; | 945 | lex_state = ls_number_e; |
| 924 | } else { | 946 | } else { |
| 925 | - numberError(); | 947 | + tokenError(); |
| 926 | } | 948 | } |
| 927 | break; | 949 | break; |
| 928 | 950 | ||
| @@ -932,7 +954,7 @@ JSONParser::getToken() | @@ -932,7 +954,7 @@ JSONParser::getToken() | ||
| 932 | } else if ((*p == '+') || (*p == '-')) { | 954 | } else if ((*p == '+') || (*p == '-')) { |
| 933 | lex_state = ls_number_e_sign; | 955 | lex_state = ls_number_e_sign; |
| 934 | } else { | 956 | } else { |
| 935 | - numberError(); | 957 | + tokenError(); |
| 936 | } | 958 | } |
| 937 | break; | 959 | break; |
| 938 | 960 | ||
| @@ -940,7 +962,7 @@ JSONParser::getToken() | @@ -940,7 +962,7 @@ JSONParser::getToken() | ||
| 940 | if ((*p >= '0') && (*p <= '9')) { | 962 | if ((*p >= '0') && (*p <= '9')) { |
| 941 | lex_state = ls_number; | 963 | lex_state = ls_number; |
| 942 | } else { | 964 | } else { |
| 943 | - numberError(); | 965 | + tokenError(); |
| 944 | } | 966 | } |
| 945 | break; | 967 | break; |
| 946 | 968 | ||
| @@ -955,7 +977,7 @@ JSONParser::getToken() | @@ -955,7 +977,7 @@ JSONParser::getToken() | ||
| 955 | action = reread; | 977 | action = reread; |
| 956 | ready = true; | 978 | ready = true; |
| 957 | } else { | 979 | } else { |
| 958 | - numberError(); | 980 | + tokenError(); |
| 959 | } | 981 | } |
| 960 | break; | 982 | break; |
| 961 | 983 | ||
| @@ -969,10 +991,7 @@ JSONParser::getToken() | @@ -969,10 +991,7 @@ JSONParser::getToken() | ||
| 969 | action = reread; | 991 | action = reread; |
| 970 | ready = true; | 992 | ready = true; |
| 971 | } else { | 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 | break; | 996 | break; |
| 978 | 997 | ||
| @@ -1025,11 +1044,8 @@ JSONParser::getToken() | @@ -1025,11 +1044,8 @@ JSONParser::getToken() | ||
| 1025 | u_value = 0; | 1044 | u_value = 0; |
| 1026 | break; | 1045 | break; |
| 1027 | default: | 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 | break; | 1050 | break; |
| 1035 | 1051 | ||
| @@ -1043,10 +1059,7 @@ JSONParser::getToken() | @@ -1043,10 +1059,7 @@ JSONParser::getToken() | ||
| 1043 | } else if ('A' <= *p && *p <= 'F') { | 1059 | } else if ('A' <= *p && *p <= 'F') { |
| 1044 | u_value = 16 * u_value + (10 + ui(*p) - ui('A')); | 1060 | u_value = 16 * u_value + (10 + ui(*p) - ui('A')); |
| 1045 | } else { | 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 | if (++u_count == 4) { | 1064 | if (++u_count == 4) { |
| 1052 | handle_u_code( | 1065 | handle_u_code( |
| @@ -1094,8 +1107,7 @@ JSONParser::getToken() | @@ -1094,8 +1107,7 @@ JSONParser::getToken() | ||
| 1094 | break; | 1107 | break; |
| 1095 | 1108 | ||
| 1096 | default: | 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 | } |