parser: check for std::out_of_range from stoul

This commit is contained in:
Justin Viiret 2017-02-03 11:17:47 +11:00 committed by Matthew Barr
parent 821a1b81e6
commit 084596bb5e

View File

@ -974,7 +974,12 @@ unichar readUtf8CodePoint4c(const char *s) {
'\\o{' [0-7]+ '}' => {
string oct(ts + 3, te - ts - 4);
unsigned long val = stoul(oct, nullptr, 8);
unsigned long val;
try {
val = stoul(oct, nullptr, 8);
} catch (const std::out_of_range &) {
val = MAX_UNICODE + 1;
}
if ((!mode.utf8 && val > 255) || val > MAX_UNICODE) {
throw LocatedParseError("Value in \\o{...} sequence is too large");
}
@ -999,7 +1004,12 @@ unichar readUtf8CodePoint4c(const char *s) {
# Unicode Hex
'\\x{' xdigit+ '}' => {
string hex(ts + 3, te - ts - 4);
unsigned long val = stoul(hex, nullptr, 16);
unsigned long val;
try {
val = stoul(hex, nullptr, 16);
} catch (const std::out_of_range &) {
val = MAX_UNICODE + 1;
}
if (val > MAX_UNICODE) {
throw LocatedParseError("Value in \\x{...} sequence is too large");
}
@ -1488,7 +1498,12 @@ unichar readUtf8CodePoint4c(const char *s) {
};
'\\o{' [0-7]+ '}' => {
string oct(ts + 3, te - ts - 4);
unsigned long val = stoul(oct, nullptr, 8);
unsigned long val;
try {
val = stoul(oct, nullptr, 8);
} catch (const std::out_of_range &) {
val = MAX_UNICODE + 1;
}
if ((!mode.utf8 && val > 255) || val > MAX_UNICODE) {
throw LocatedParseError("Value in \\o{...} sequence is too large");
}
@ -1505,7 +1520,12 @@ unichar readUtf8CodePoint4c(const char *s) {
# Unicode Hex
'\\x{' xdigit+ '}' => {
string hex(ts + 3, te - ts - 4);
unsigned long val = stoul(hex, nullptr, 16);
unsigned long val;
try {
val = stoul(hex, nullptr, 16);
} catch (const std::out_of_range &) {
val = MAX_UNICODE + 1;
}
if (val > MAX_UNICODE) {
throw LocatedParseError("Value in \\x{...} sequence is too large");
}