From b5bd05b71732ebfdbd1e94571e717be885d9e458 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Tue, 27 Oct 2020 19:30:27 +0000 Subject: [PATCH] LibJS: Don't parse numeric literal containing 8 or 9 as octal If the value has a leading zero (allowed in non-strict mode) but contains the digits 8 or 9 it can't be an octal number. --- Libraries/LibJS/Tests/numeric-literals-basic.js | 1 + Libraries/LibJS/Token.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Libraries/LibJS/Tests/numeric-literals-basic.js b/Libraries/LibJS/Tests/numeric-literals-basic.js index f226581320..b4b9f75181 100644 --- a/Libraries/LibJS/Tests/numeric-literals-basic.js +++ b/Libraries/LibJS/Tests/numeric-literals-basic.js @@ -10,6 +10,7 @@ test("octal literals", () => { expect(0o10).toBe(8); expect(0o10).toBe(8); expect(010).toBe(8); + expect(089).toBe(89); }); test("binary literals", () => { diff --git a/Libraries/LibJS/Token.cpp b/Libraries/LibJS/Token.cpp index 082e8ac9aa..2826f7fbf6 100644 --- a/Libraries/LibJS/Token.cpp +++ b/Libraries/LibJS/Token.cpp @@ -86,7 +86,8 @@ double Token::double_value() const return static_cast(strtoul(value_string.characters() + 2, nullptr, 2)); } else if (isdigit(value_string[1])) { // also octal, but syntax error in strict mode - return static_cast(strtoul(value_string.characters() + 1, nullptr, 8)); + if (!m_value.contains('8') && !m_value.contains('9')) + return static_cast(strtoul(value_string.characters() + 1, nullptr, 8)); } } return strtod(value_string.characters(), nullptr);