mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
parser: check for std::out_of_range from stoul
This commit is contained in:
parent
821a1b81e6
commit
084596bb5e
@ -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");
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user