Commit f5b7448a2732d0e6f39855b98ebca63df2824916

Authored by m-holger
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 }
... ...