瀏覽代碼

LibJS: Protect [TimeValue]FromTime from non-finite times

Includes HourFromTime, MinFromTime, SecFromTime, msFromTime.
Timothy Flynn 3 年之前
父節點
當前提交
efda1724e8
共有 1 個文件被更改,包括 15 次插入0 次删除
  1. 15 0
      Userland/Libraries/LibJS/Runtime/Date.cpp

+ 15 - 0
Userland/Libraries/LibJS/Runtime/Date.cpp

@@ -222,6 +222,9 @@ u8 month_from_time(double t)
 // HourFromTime(t), https://tc39.es/ecma262/#eqn-HourFromTime
 // HourFromTime(t), https://tc39.es/ecma262/#eqn-HourFromTime
 u8 hour_from_time(double t)
 u8 hour_from_time(double t)
 {
 {
+    if (!Value(t).is_finite_number())
+        return 0;
+
     // 𝔽(floor(ℝ(t / msPerHour)) modulo HoursPerDay)
     // 𝔽(floor(ℝ(t / msPerHour)) modulo HoursPerDay)
     return static_cast<u8>(modulo(floor(t / Date::ms_per_hour), Date::hours_per_day));
     return static_cast<u8>(modulo(floor(t / Date::ms_per_hour), Date::hours_per_day));
 }
 }
@@ -229,6 +232,9 @@ u8 hour_from_time(double t)
 // MinFromTime(t), https://tc39.es/ecma262/#eqn-MinFromTime
 // MinFromTime(t), https://tc39.es/ecma262/#eqn-MinFromTime
 u8 min_from_time(double t)
 u8 min_from_time(double t)
 {
 {
+    if (!Value(t).is_finite_number())
+        return 0;
+
     // 𝔽(floor(ℝ(t / msPerMinute)) modulo MinutesPerHour)
     // 𝔽(floor(ℝ(t / msPerMinute)) modulo MinutesPerHour)
     return static_cast<u8>(modulo(floor(t / Date::ms_per_minute), Date::minutes_per_hour));
     return static_cast<u8>(modulo(floor(t / Date::ms_per_minute), Date::minutes_per_hour));
 }
 }
@@ -236,6 +242,9 @@ u8 min_from_time(double t)
 // SecFromTime(t), https://tc39.es/ecma262/#eqn-SecFromTime
 // SecFromTime(t), https://tc39.es/ecma262/#eqn-SecFromTime
 u8 sec_from_time(double t)
 u8 sec_from_time(double t)
 {
 {
+    if (!Value(t).is_finite_number())
+        return 0;
+
     // 𝔽(floor(ℝ(t / msPerSecond)) modulo SecondsPerMinute)
     // 𝔽(floor(ℝ(t / msPerSecond)) modulo SecondsPerMinute)
     return static_cast<u8>(modulo(floor(t / Date::ms_per_second), Date::seconds_per_minute));
     return static_cast<u8>(modulo(floor(t / Date::ms_per_second), Date::seconds_per_minute));
 }
 }
@@ -243,6 +252,9 @@ u8 sec_from_time(double t)
 // msFromTime(t), https://tc39.es/ecma262/#eqn-msFromTime
 // msFromTime(t), https://tc39.es/ecma262/#eqn-msFromTime
 u16 ms_from_time(double t)
 u16 ms_from_time(double t)
 {
 {
+    if (!Value(t).is_finite_number())
+        return 0;
+
     // 𝔽(ℝ(t) modulo msPerSecond)
     // 𝔽(ℝ(t) modulo msPerSecond)
     return static_cast<u16>(modulo(t, Date::ms_per_second));
     return static_cast<u16>(modulo(t, Date::ms_per_second));
 }
 }
@@ -250,6 +262,9 @@ u16 ms_from_time(double t)
 // 21.4.1.6 Week Day, https://tc39.es/ecma262/#sec-week-day
 // 21.4.1.6 Week Day, https://tc39.es/ecma262/#sec-week-day
 u8 week_day(double t)
 u8 week_day(double t)
 {
 {
+    if (!Value(t).is_finite_number())
+        return 0;
+
     // 𝔽(ℝ(Day(t) + 4𝔽) modulo 7)
     // 𝔽(ℝ(Day(t) + 4𝔽) modulo 7)
     return static_cast<u8>(modulo(day(t) + 4, 7));
     return static_cast<u8>(modulo(day(t) + 4, 7));
 }
 }