Skip to content

Commit 5f3428b

Browse files
authored
Fix runtime error Date object (#4914)
This patch fixes #4704 JerryScript-DCO-1.0-Signed-off-by: Daniel Batiz [email protected]
1 parent 4a39946 commit 5f3428b

File tree

5 files changed

+57
-5
lines changed

5 files changed

+57
-5
lines changed

jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ ecma_date_day_from_time (ecma_number_t time) /**< time value */
7474
static int32_t
7575
ecma_date_day_from_year (int32_t year) /**< year value */
7676
{
77+
JERRY_ASSERT (fabs (365.0 * (year - 1970) + ((year - 1969) / 4.0) - ((year - 1901) / 100.0) + ((year - 1601) / 400.0))
78+
< INT32_MAX);
79+
7780
if (JERRY_LIKELY (year >= 1970))
7881
{
7982
return (int32_t) (365 * (year - 1970) + ((year - 1969) / 4) - ((year - 1901) / 100) + ((year - 1601) / 400));
@@ -420,19 +423,23 @@ ecma_date_make_day (ecma_number_t year, /**< year value */
420423
ecma_number_t date) /**< date value */
421424
{
422425
/* 1. */
423-
if (!ecma_number_is_finite (year) || !ecma_number_is_finite (month) || !ecma_number_is_finite (date)
424-
|| fabs (year) > INT32_MAX)
426+
if (!ecma_number_is_finite (year) || !ecma_number_is_finite (month) || !ecma_number_is_finite (date))
425427
{
426428
return ecma_number_make_nan ();
427429
}
428430

429431
/* 2., 3., 4. */
430-
int32_t y = (int32_t) (year);
431432
ecma_number_t m = ecma_number_trunc (month);
432433
ecma_number_t dt = ecma_number_trunc (date);
433434

434435
/* 5. */
435-
int32_t ym = y + (int32_t) (floor (m / 12));
436+
year += (floor (m / 12));
437+
if (fabs (year) > ECMA_DATE_YEAR_LIMIT)
438+
{
439+
return ecma_number_make_nan ();
440+
}
441+
442+
int32_t int_year = (int32_t) year;
436443

437444
/* 6. */
438445
int32_t mn = (int32_t) fmod (m, 12);
@@ -443,7 +450,8 @@ ecma_date_make_day (ecma_number_t year, /**< year value */
443450
}
444451

445452
/* 7. */
446-
ecma_number_t days = (ecma_date_day_from_year (ym) + first_day_in_month[ecma_date_in_leap_year (ym)][mn] + (dt - 1));
453+
ecma_number_t days =
454+
(ecma_date_day_from_year (int_year) + first_day_in_month[ecma_date_in_leap_year (int_year)][mn] + (dt - 1));
447455
return days * ECMA_DATE_MS_PER_DAY;
448456
} /* ecma_date_make_day */
449457

jerry-core/ecma/builtin-objects/ecma-builtin-helpers.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ bool ecma_builtin_is_regexp_exec (ecma_extended_object_t *obj_p);
157157

158158
#define ECMA_DATE_DAYS_IN_LEAP_YEAR (366)
159159

160+
#define ECMA_DATE_YEAR_LIMIT (275800)
161+
160162
/**
161163
* This gives a range of 8,640,000,000,000,000 milliseconds
162164
* to either side of 01 January, 1970 UTC.

tests/jerry/date-getters.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,17 @@ assert (new Date(-1, -1, -1, -1, -1).getHours() === 22);
104104
assert (new Date(-1, -1, -1, -1, -1, -1).getMinutes() === 58);
105105
assert (new Date(-1, -1, -1, -1, -1, -1, -1).getSeconds() === 58);
106106
assert (new Date(-1, -1, -1, -1, -1, -1, -1, -1).getMilliseconds() === 999);
107+
108+
/* 6. test case */
109+
assert (isNaN(new Date(20000000, 0).getFullYear()));
110+
assert (new Date(0, 0).getFullYear() === 1900);
111+
assert (new Date(1.2, 0).getFullYear() === 1901);
112+
assert((new Date(8640000000000000).getFullYear()) == 275760);
113+
assert(isNaN(new Date(8640000000000001).getFullYear()));
114+
assert((new Date(-271821, 3, 21).getFullYear()) == -271821);
115+
assert(isNaN(new Date(1970, 0, -100000000).getFullYear()));
116+
assert(new Date(1970, 0, -100000000 + 1).getFullYear() == -271821);
117+
assert(isNaN(new Date(1970, 0, 100000000 + 2).getFullYear()));
118+
assert(new Date(1970, 0, 100000000).getFullYear() == 275760);
119+
assert(isNaN(new Date(4294967295, -51536298411).getFullYear()));
120+
assert((new Date(4294967295, -51536300000).getFullYear()) == 275628);

tests/jerry/date-parse.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,3 +181,12 @@ assert (isNaN(Date.parse("Sat, 13 Sep 275760 00:00:01 GMT"))) // 864000000000100
181181
// Non standard date formats
182182
assert (Date.parse("2000/01/01 12:12Z") == 946728720000)
183183
assert (Date.parse("1991-07-13 16:04Z") == 679421040000)
184+
185+
assert(Date.parse('Tue, 13 Sep 275760 00:00:00 GMT') == 8640000000000000);
186+
assert(isNaN(Date.parse('Tue, 14 Sep 275760 00:00:00 GMT')));
187+
assert(Date.parse("Tue, 20 Apr -271821 00:00:00 GMT") == -8640000000000000);
188+
assert(isNaN(Date.parse("Tue, 19 Apr -271821 00:00:00 GMT")));
189+
assert(Date.parse('9999') == 253370764800000);
190+
assert(isNaN(Date.parse('10000')));
191+
assert(Date.parse('-100000') == -3217862419200000);
192+
assert(isNaN(Date.parse('-99999')));

tests/jerry/date-setters.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,3 +241,22 @@ assert (isNaN (d.setMonth()));
241241
assert (isNaN (d.setUTCMonth()));
242242
assert (isNaN (d.setFullYear()));
243243
assert (isNaN (d.setUTCFullYear()));
244+
245+
var date = new Date('1975-08-19');
246+
var date2 = new Date('1975-08-19');
247+
var date3 = new Date('1975-08-19');
248+
var date4 = new Date('1975-08-19');
249+
var date5 = new Date('1975-08-19');
250+
var date6 = new Date('1975-08-19');
251+
date.setFullYear(275760, 8, 13);
252+
date2.setFullYear(275760, 8, 14);
253+
date3.setFullYear(-271820, 6570968, 13);
254+
date4.setFullYear(-271820, 6570968, 14);
255+
date5.setFullYear(-271821);
256+
date6.setFullYear(-271822);
257+
assert(date.getFullYear() == 275760);
258+
assert(isNaN(date2.getFullYear()));
259+
assert(date3.getFullYear() == 275760);
260+
assert(isNaN(date4.getFullYear()));
261+
assert(date5.getFullYear() == -271821);
262+
assert(isNaN(date6.getFullYear()));

0 commit comments

Comments
 (0)