From 7624c3de0e2cb4bce171a3524cdbc070257ef93c Mon Sep 17 00:00:00 2001 From: davidot Date: Fri, 26 Nov 2021 23:26:42 +0100 Subject: LibJS: Disallow '\8' and '\9' in strict mode due to being octal escapes --- Userland/Libraries/LibJS/Tests/string-escapes.js | 7 +++++++ Userland/Libraries/LibJS/Token.cpp | 6 ++++++ 2 files changed, 13 insertions(+) (limited to 'Userland') diff --git a/Userland/Libraries/LibJS/Tests/string-escapes.js b/Userland/Libraries/LibJS/Tests/string-escapes.js index 64a81b1fe1..9b45d08588 100644 --- a/Userland/Libraries/LibJS/Tests/string-escapes.js +++ b/Userland/Libraries/LibJS/Tests/string-escapes.js @@ -62,4 +62,11 @@ describe("octal escapes", () => { // Because of the non string statement in the middle strict mode is not enabled. expect("'\\123'; somethingElse; 'use strict'").toEval(); }); + + test("invalid octal escapes fail in strict mode", () => { + expect("'use strict'; '\\8'").not.toEval(); + expect("'use strict'; '\\800'").not.toEval(); + expect("'use strict'; '\\9'").not.toEval(); + expect("'use strict'; '\\912'").not.toEval(); + }); }); diff --git a/Userland/Libraries/LibJS/Token.cpp b/Userland/Libraries/LibJS/Token.cpp index 16f0a00443..9a51a15508 100644 --- a/Userland/Libraries/LibJS/Token.cpp +++ b/Userland/Libraries/LibJS/Token.cpp @@ -198,6 +198,12 @@ String Token::string_value(StringValueStatus& status) const continue; } + if (lexer.next_is('8') || lexer.next_is('9')) { + status = StringValueStatus::LegacyOctalEscapeSequence; + builder.append(lexer.consume()); + continue; + } + lexer.retreat(); builder.append(lexer.consume_escaped_character('\\', "b\bf\fn\nr\rt\tv\v")); } -- cgit v1.2.3