mirror of
https://github.com/qpdf/qpdf.git
synced 2024-09-28 04:59:05 +00:00
Extend scope of JSONParser::numberError and rename tokenError
Handle all incomplete token type errors in tokenError.
This commit is contained in:
parent
5ac6a12e0a
commit
f5b7448a27
@ -607,7 +607,7 @@ namespace
|
|||||||
private:
|
private:
|
||||||
void getToken();
|
void getToken();
|
||||||
void handleToken();
|
void handleToken();
|
||||||
void numberError();
|
void tokenError();
|
||||||
static void handle_u_code(
|
static void handle_u_code(
|
||||||
unsigned long codepoint,
|
unsigned long codepoint,
|
||||||
qpdf_offset_t offset,
|
qpdf_offset_t offset,
|
||||||
@ -721,8 +721,29 @@ JSONParser::handle_u_code(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
JSONParser::numberError()
|
JSONParser::tokenError()
|
||||||
{
|
{
|
||||||
|
if (bytes == 0) {
|
||||||
|
QTC::TC("libtests", "JSON parse ls premature end of input");
|
||||||
|
throw std::runtime_error("JSON: premature end of input");
|
||||||
|
}
|
||||||
|
if (lex_state == ls_u4) {
|
||||||
|
QTC::TC("libtests", "JSON parse bad hex after u");
|
||||||
|
throw std::runtime_error(
|
||||||
|
"JSON: offset " + std::to_string(offset - u_count - 1) +
|
||||||
|
": \\u must be followed by four hex digits");
|
||||||
|
} else if (lex_state == ls_alpha) {
|
||||||
|
QTC::TC("libtests", "JSON parse keyword bad character");
|
||||||
|
throw std::runtime_error(
|
||||||
|
"JSON: offset " + std::to_string(offset) +
|
||||||
|
": keyword: unexpected character " + std::string(p, 1));
|
||||||
|
} else if (lex_state == ls_backslash) {
|
||||||
|
QTC::TC("libtests", "JSON parse backslash bad character");
|
||||||
|
throw std::runtime_error(
|
||||||
|
"JSON: offset " + std::to_string(offset) +
|
||||||
|
": invalid character after backslash: " + std::string(p, 1));
|
||||||
|
}
|
||||||
|
|
||||||
if (*p == '.') {
|
if (*p == '.') {
|
||||||
if (lex_state == ls_number || lex_state == ls_number_e ||
|
if (lex_state == ls_number || lex_state == ls_number_e ||
|
||||||
lex_state == ls_number_e_sign) {
|
lex_state == ls_number_e_sign) {
|
||||||
@ -751,6 +772,7 @@ JSONParser::numberError()
|
|||||||
throw std::runtime_error(
|
throw std::runtime_error(
|
||||||
"JSON: offset " + std::to_string(offset) +
|
"JSON: offset " + std::to_string(offset) +
|
||||||
": numeric literal: incomplete number");
|
": numeric literal: incomplete number");
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
QTC::TC("libtests", "JSON parse numeric bad character");
|
QTC::TC("libtests", "JSON parse numeric bad character");
|
||||||
throw std::runtime_error(
|
throw std::runtime_error(
|
||||||
@ -896,7 +918,7 @@ JSONParser::getToken()
|
|||||||
} else if (*p == 'e' || *p == 'E') {
|
} else if (*p == 'e' || *p == 'E') {
|
||||||
lex_state = ls_number_e;
|
lex_state = ls_number_e;
|
||||||
} else {
|
} else {
|
||||||
numberError();
|
tokenError();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -904,7 +926,7 @@ JSONParser::getToken()
|
|||||||
if ((*p >= '0') && (*p <= '9')) {
|
if ((*p >= '0') && (*p <= '9')) {
|
||||||
lex_state = ls_number_after_point;
|
lex_state = ls_number_after_point;
|
||||||
} else {
|
} else {
|
||||||
numberError();
|
tokenError();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -922,7 +944,7 @@ JSONParser::getToken()
|
|||||||
} else if (*p == 'e' || *p == 'E') {
|
} else if (*p == 'e' || *p == 'E') {
|
||||||
lex_state = ls_number_e;
|
lex_state = ls_number_e;
|
||||||
} else {
|
} else {
|
||||||
numberError();
|
tokenError();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -932,7 +954,7 @@ JSONParser::getToken()
|
|||||||
} else if ((*p == '+') || (*p == '-')) {
|
} else if ((*p == '+') || (*p == '-')) {
|
||||||
lex_state = ls_number_e_sign;
|
lex_state = ls_number_e_sign;
|
||||||
} else {
|
} else {
|
||||||
numberError();
|
tokenError();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -940,7 +962,7 @@ JSONParser::getToken()
|
|||||||
if ((*p >= '0') && (*p <= '9')) {
|
if ((*p >= '0') && (*p <= '9')) {
|
||||||
lex_state = ls_number;
|
lex_state = ls_number;
|
||||||
} else {
|
} else {
|
||||||
numberError();
|
tokenError();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -955,7 +977,7 @@ JSONParser::getToken()
|
|||||||
action = reread;
|
action = reread;
|
||||||
ready = true;
|
ready = true;
|
||||||
} else {
|
} else {
|
||||||
numberError();
|
tokenError();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -969,10 +991,7 @@ JSONParser::getToken()
|
|||||||
action = reread;
|
action = reread;
|
||||||
ready = true;
|
ready = true;
|
||||||
} else {
|
} else {
|
||||||
QTC::TC("libtests", "JSON parse keyword bad character");
|
tokenError();
|
||||||
throw std::runtime_error(
|
|
||||||
"JSON: offset " + std::to_string(offset) +
|
|
||||||
": keyword: unexpected character " + std::string(p, 1));
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1025,11 +1044,8 @@ JSONParser::getToken()
|
|||||||
u_value = 0;
|
u_value = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
QTC::TC("libtests", "JSON parse backslash bad character");
|
lex_state = ls_backslash;
|
||||||
throw std::runtime_error(
|
tokenError();
|
||||||
"JSON: offset " + std::to_string(offset) +
|
|
||||||
": invalid character after backslash: " +
|
|
||||||
std::string(p, 1));
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1043,10 +1059,7 @@ JSONParser::getToken()
|
|||||||
} else if ('A' <= *p && *p <= 'F') {
|
} else if ('A' <= *p && *p <= 'F') {
|
||||||
u_value = 16 * u_value + (10 + ui(*p) - ui('A'));
|
u_value = 16 * u_value + (10 + ui(*p) - ui('A'));
|
||||||
} else {
|
} else {
|
||||||
QTC::TC("libtests", "JSON parse bad hex after u");
|
tokenError();
|
||||||
throw std::runtime_error(
|
|
||||||
"JSON: offset " + std::to_string(offset - u_count - 1) +
|
|
||||||
": \\u must be followed by four hex digits");
|
|
||||||
}
|
}
|
||||||
if (++u_count == 4) {
|
if (++u_count == 4) {
|
||||||
handle_u_code(
|
handle_u_code(
|
||||||
@ -1094,8 +1107,7 @@ JSONParser::getToken()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
QTC::TC("libtests", "JSON parse ls premature end of input");
|
tokenError();
|
||||||
throw std::runtime_error("JSON: premature end of input");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user