Bug 1490115 - Handle unaccompanied low surrogate pairs in the prefs parser. r=glandium

Currently they cause the `String::from_utf16()` call to return an error result,
and then the subsequent `unwrap()` on that result aborts.

--HG--
extra : rebase_source : 6be81d4d1e618444f762a1ba4e93b5ce648dd45b
This commit is contained in:
Nicholas Nethercote 2018-09-11 09:41:37 +10:00
parent eafdf2d611
commit 46c70d27ee
2 changed files with 19 additions and 5 deletions

View File

@ -600,8 +600,7 @@ impl<'t> Parser<'t> {
}
// Returns false if we hit EOF without closing the comment.
fn match_multi_line_comment(&mut self) -> bool
{
fn match_multi_line_comment(&mut self) -> bool {
loop {
match self.get_char() {
b'*' => {
@ -854,7 +853,7 @@ impl<'t> Parser<'t> {
} else {
self.string_error_token(
&mut token,
"invalid low surrogate value after high surrogate");
"invalid low surrogate after high surrogate");
continue;
}
}
@ -864,6 +863,11 @@ impl<'t> Parser<'t> {
&mut token, "expected low surrogate after high surrogate");
continue;
}
} else if 0xdc00 == (0xfc00 & value) {
// Unaccompanied low surrogate value.
self.string_error_token(
&mut token, "expected high surrogate before low surrogate");
continue;
} else if value == 0 {
self.string_error_token(&mut token, "\\u0000 is not allowed");
continue;

View File

@ -196,14 +196,24 @@ pref("int.ok", 0);
"test:2: prefs parse error: expected low surrogate after high surrogate\n"
);
// High surrogate followed by invalid low surrogate value.
// High surrogate followed by invalid low surrogate.
// (The string literal is broken in two so that MSVC doesn't complain about
// an invalid universal-character-name.)
DEFAULT(R"(
pref("string.bad-u-surrogate", "foo\)" R"(ud83c\u1234");
pref("int.ok", 0);
)",
"test:2: prefs parse error: invalid low surrogate value after high surrogate\n"
"test:2: prefs parse error: invalid low surrogate after high surrogate\n"
);
// Low surrogate not preceded by high surrogate.
// (The string literal is broken in two so that MSVC doesn't complain about
// an invalid universal-character-name.)
DEFAULT(R"(
pref("string.bad-u-surrogate", "foo\)" R"(udc00");
pref("int.ok", 0);
)",
"test:2: prefs parse error: expected high surrogate before low surrogate\n"
);
// Unlike in JavaScript, \b, \f, \t, \v aren't allowed.