1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 12:48:10 +00:00

LibRegex: Parse \0 as a zero-byte instead of 0x30 ("0")

This was causing some regexes to trip up. Fixes #6202.
This commit is contained in:
Jelle Raaijmakers 2021-04-09 19:30:23 +02:00 committed by Andreas Kling
parent 2c94c9fa7f
commit db321db5f4
3 changed files with 5 additions and 18 deletions

View file

@ -873,26 +873,14 @@ StringView ECMA262Parser::read_digits_as_string(ReadDigitsInitialZeroState initi
if (!match(TokenType::Char))
return {};
if (initial_zero != ReadDigitsInitialZeroState::Allow) {
auto has_initial_zero = m_parser_state.current_token.value() == "0";
if (initial_zero == ReadDigitsInitialZeroState::Disallow && has_initial_zero)
return {};
if (initial_zero == ReadDigitsInitialZeroState::Require && !has_initial_zero)
return {};
}
if (initial_zero == ReadDigitsInitialZeroState::Disallow && m_parser_state.current_token.value() == "0")
return {};
int count = 0;
size_t offset = 0;
auto start_token = m_parser_state.current_token;
while (match(TokenType::Char)) {
auto c = m_parser_state.current_token.value();
if (follow_policy == ReadDigitFollowPolicy::DisallowDigit) {
if (hex && AK::StringUtils::convert_to_uint_from_hex(c).has_value())
break;
if (!hex && c.to_uint().has_value())
break;
}
if (follow_policy == ReadDigitFollowPolicy::DisallowNonDigit) {
if (hex && !AK::StringUtils::convert_to_uint_from_hex(c).has_value())
@ -1213,7 +1201,7 @@ bool ECMA262Parser::parse_atom_escape(ByteCode& stack, size_t& match_length_mini
}
// '\0'
if (read_digits(ReadDigitsInitialZeroState::Require, ReadDigitFollowPolicy::DisallowDigit).has_value()) {
if (try_skip("0")) {
match_length_minimum += 1;
stack.insert_bytecode_compare_values({ { CharacterCompareType::Char, (ByteCodeValueType)0 } });
return true;
@ -1496,7 +1484,7 @@ bool ECMA262Parser::parse_nonempty_class_ranges(Vector<CompareTypeAndValuePair>&
}
// '\0'
if (read_digits(ReadDigitsInitialZeroState::Require, ReadDigitFollowPolicy::DisallowDigit).has_value())
if (try_skip("0"))
return { { .code_point = 0, .is_character_class = false } };
// HexEscape