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,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 }