Переглянути джерело

LibJS: Check if input was exhausted after parsing UTC offset fraction

Previously parse_time_zone_numeric_utc_offset_syntax() would return true
to indicate success when parsing a string with an invalid number of
digits in the fractional seconds part (e.g. 23:59:59.9999999999).
We need to check if the lexer has any characters remaining, and return
false if that's the case.
Linus Groh 3 роки тому
батько
коміт
f1276144ba

+ 3 - 1
Userland/Libraries/LibJS/Runtime/Temporal/TimeZone.cpp

@@ -230,7 +230,9 @@ static bool parse_time_zone_numeric_utc_offset_syntax(String const& offset_strin
     if (!lexer.consume_specific('.') && !lexer.consume_specific(','))
     if (!lexer.consume_specific('.') && !lexer.consume_specific(','))
         return false;
         return false;
     fraction = lexer.consume_fractional_seconds();
     fraction = lexer.consume_fractional_seconds();
-    return fraction.has_value();
+    if (!fraction.has_value())
+        return false;
+    return !lexer.tell_remaining();
 }
 }
 
 
 bool is_valid_time_zone_numeric_utc_offset_syntax(String const& offset_string)
 bool is_valid_time_zone_numeric_utc_offset_syntax(String const& offset_string)

+ 10 - 0
Userland/Libraries/LibJS/Tests/builtins/Temporal/TimeZone/TimeZone.js

@@ -10,6 +10,16 @@ describe("errors", () => {
             new Temporal.TimeZone("foo");
             new Temporal.TimeZone("foo");
         }).toThrowWithMessage(RangeError, "Invalid time zone name 'foo'");
         }).toThrowWithMessage(RangeError, "Invalid time zone name 'foo'");
     });
     });
+
+    test("Invalid numeric UTC offset", () => {
+        // FIXME: Error message should probably say '...name or UTC offset ...' :^)
+        expect(() => {
+            new Temporal.TimeZone("0123456");
+        }).toThrowWithMessage(RangeError, "Invalid time zone name '0123456'");
+        expect(() => {
+            new Temporal.TimeZone("23:59:59.9999999999");
+        }).toThrowWithMessage(RangeError, "Invalid time zone name '23:59:59.9999999999'");
+    });
 });
 });
 
 
 describe("normal behavior", () => {
 describe("normal behavior", () => {