mirror of https://github.com/tc39/test262.git
Temporal: Tests for malicious time zones with zero-length days
Based on test cases provided by Anba in https://github.com/tc39/proposal-temporal/issues/2333. (Thanks!)
This commit is contained in:
parent
feb6f107f8
commit
63e451dc80
|
@ -0,0 +1,40 @@
|
||||||
|
// Copyright (C) 2023 Igalia, S.L. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-temporal.duration.prototype.round
|
||||||
|
description: A malicious time zone resulting a day length of zero is handled correctly
|
||||||
|
info: |
|
||||||
|
Based on a test by André Bargull.
|
||||||
|
|
||||||
|
RoundDuration step 6:
|
||||||
|
d. Let _result_ be ? NanosecondsToDays(_nanoseconds_, _intermediate_).
|
||||||
|
e. Set _days_ to _days_ + _result_.[[Days]] + _result_.[[Nanoseconds]] / _result_.[[DayLength]].
|
||||||
|
|
||||||
|
NanosecondsToDays steps 19-23:
|
||||||
|
19. If _days_ < 0 and _sign_ = 1, throw a *RangeError* exception.
|
||||||
|
20. If _days_ > 0 and _sign_ = -1, throw a *RangeError* exception.
|
||||||
|
21. If _nanoseconds_ < 0, then
|
||||||
|
a. Assert: sign is -1.
|
||||||
|
22. If _nanoseconds_ > 0 and _sign_ = -1, throw a *RangeError* exception.
|
||||||
|
23. Assert: The inequality abs(_nanoseconds_) < abs(_dayLengthNs_) holds.
|
||||||
|
features: [Temporal]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
const instance = new Temporal.Duration(0, 0, 0, 0, -24, 0, 0, 0, 0, -1);
|
||||||
|
|
||||||
|
const tz = new class extends Temporal.TimeZone {
|
||||||
|
#getPossibleInstantsForCalls = 0;
|
||||||
|
|
||||||
|
getPossibleInstantsFor(dt) {
|
||||||
|
this.#getPossibleInstantsForCalls++;
|
||||||
|
|
||||||
|
if (this.#getPossibleInstantsForCalls <= 2) {
|
||||||
|
return [new Temporal.Instant(-86400_000_000_000n - 2n)]
|
||||||
|
}
|
||||||
|
return super.getPossibleInstantsFor(dt);
|
||||||
|
}
|
||||||
|
}("UTC");
|
||||||
|
|
||||||
|
const relativeTo = new Temporal.ZonedDateTime(0n, tz, "iso8601");
|
||||||
|
assert.throws(RangeError, () => instance.round({ relativeTo, smallestUnit: "days" }));
|
|
@ -0,0 +1,53 @@
|
||||||
|
// Copyright (C) 2023 Igalia, S.L. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-temporal.duration.prototype.round
|
||||||
|
description: A malicious time zone resulting a day length of zero is handled correctly
|
||||||
|
info: |
|
||||||
|
Based on a test by André Bargull.
|
||||||
|
|
||||||
|
RoundDuration step 6:
|
||||||
|
d. Let _result_ be ? NanosecondsToDays(_nanoseconds_, _intermediate_).
|
||||||
|
e. Set _days_ to _days_ + _result_.[[Days]] + _result_.[[Nanoseconds]] / _result_.[[DayLength]].
|
||||||
|
|
||||||
|
NanosecondsToDays steps 19-23:
|
||||||
|
19. If _days_ < 0 and _sign_ = 1, throw a *RangeError* exception.
|
||||||
|
20. If _days_ > 0 and _sign_ = -1, throw a *RangeError* exception.
|
||||||
|
21. If _nanoseconds_ < 0, then
|
||||||
|
a. Assert: sign is -1.
|
||||||
|
22. If _nanoseconds_ > 0 and _sign_ = -1, throw a *RangeError* exception.
|
||||||
|
23. Assert: The inequality abs(_nanoseconds_) < abs(_dayLengthNs_) holds.
|
||||||
|
features: [Temporal]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
const instance = new Temporal.Duration(0, 0, 0, 0, 24, 0, 0, 0, 0, 1);
|
||||||
|
|
||||||
|
const tz = new class extends Temporal.TimeZone {
|
||||||
|
#getPossibleInstantsForCalls = 0;
|
||||||
|
|
||||||
|
getPossibleInstantsFor(dt) {
|
||||||
|
this.#getPossibleInstantsForCalls++;
|
||||||
|
|
||||||
|
if (this.#getPossibleInstantsForCalls <= 2) {
|
||||||
|
return [new Temporal.Instant(86400_000_000_000n + 2n)]
|
||||||
|
}
|
||||||
|
return super.getPossibleInstantsFor(dt);
|
||||||
|
}
|
||||||
|
}("UTC");
|
||||||
|
|
||||||
|
const cal = new class extends Temporal.Calendar {
|
||||||
|
#dateUntilCalls = 0;
|
||||||
|
|
||||||
|
dateUntil(one, two, options) {
|
||||||
|
this.#dateUntilCalls++;
|
||||||
|
|
||||||
|
if (this.#dateUntilCalls === 1) {
|
||||||
|
return new Temporal.Duration(0, 0, 0, -2);
|
||||||
|
}
|
||||||
|
return super.dateUntil(one, two, options);
|
||||||
|
}
|
||||||
|
}("iso8601");
|
||||||
|
|
||||||
|
const relativeTo = new Temporal.ZonedDateTime(0n, tz, cal);
|
||||||
|
assert.throws(RangeError, () => instance.round({ relativeTo, smallestUnit: "days" }));
|
|
@ -0,0 +1,40 @@
|
||||||
|
// Copyright (C) 2023 Igalia, S.L. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-temporal.duration.prototype.total
|
||||||
|
description: A malicious time zone resulting a day length of zero is handled correctly
|
||||||
|
info: |
|
||||||
|
Based on a test by André Bargull.
|
||||||
|
|
||||||
|
RoundDuration step 6:
|
||||||
|
d. Let _result_ be ? NanosecondsToDays(_nanoseconds_, _intermediate_).
|
||||||
|
e. Set _days_ to _days_ + _result_.[[Days]] + _result_.[[Nanoseconds]] / _result_.[[DayLength]].
|
||||||
|
|
||||||
|
NanosecondsToDays steps 19-23:
|
||||||
|
19. If _days_ < 0 and _sign_ = 1, throw a *RangeError* exception.
|
||||||
|
20. If _days_ > 0 and _sign_ = -1, throw a *RangeError* exception.
|
||||||
|
21. If _nanoseconds_ < 0, then
|
||||||
|
a. Assert: sign is -1.
|
||||||
|
22. If _nanoseconds_ > 0 and _sign_ = -1, throw a *RangeError* exception.
|
||||||
|
23. Assert: The inequality abs(_nanoseconds_) < abs(_dayLengthNs_) holds.
|
||||||
|
features: [Temporal]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
const instance = new Temporal.Duration(0, 0, 0, 0, -24, 0, 0, 0, 0, -1);
|
||||||
|
|
||||||
|
const tz = new class extends Temporal.TimeZone {
|
||||||
|
#getPossibleInstantsForCalls = 0;
|
||||||
|
|
||||||
|
getPossibleInstantsFor(dt) {
|
||||||
|
this.#getPossibleInstantsForCalls++;
|
||||||
|
|
||||||
|
if (this.#getPossibleInstantsForCalls <= 2) {
|
||||||
|
return [new Temporal.Instant(-86400_000_000_000n - 2n)]
|
||||||
|
}
|
||||||
|
return super.getPossibleInstantsFor(dt);
|
||||||
|
}
|
||||||
|
}("UTC");
|
||||||
|
|
||||||
|
const relativeTo = new Temporal.ZonedDateTime(0n, tz, "iso8601");
|
||||||
|
assert.throws(RangeError, () => instance.total({ relativeTo, unit: "days" }));
|
|
@ -0,0 +1,53 @@
|
||||||
|
// Copyright (C) 2023 Igalia, S.L. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-temporal.duration.prototype.round
|
||||||
|
description: A malicious time zone resulting a day length of zero is handled correctly
|
||||||
|
info: |
|
||||||
|
Based on a test by André Bargull.
|
||||||
|
|
||||||
|
RoundDuration step 6:
|
||||||
|
d. Let _result_ be ? NanosecondsToDays(_nanoseconds_, _intermediate_).
|
||||||
|
e. Set _days_ to _days_ + _result_.[[Days]] + _result_.[[Nanoseconds]] / _result_.[[DayLength]].
|
||||||
|
|
||||||
|
NanosecondsToDays steps 19-23:
|
||||||
|
19. If _days_ < 0 and _sign_ = 1, throw a *RangeError* exception.
|
||||||
|
20. If _days_ > 0 and _sign_ = -1, throw a *RangeError* exception.
|
||||||
|
21. If _nanoseconds_ < 0, then
|
||||||
|
a. Assert: sign is -1.
|
||||||
|
22. If _nanoseconds_ > 0 and _sign_ = -1, throw a *RangeError* exception.
|
||||||
|
23. Assert: The inequality abs(_nanoseconds_) < abs(_dayLengthNs_) holds.
|
||||||
|
features: [Temporal]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
const instance = new Temporal.Duration(0, 0, 0, 0, 24, 0, 0, 0, 0, 1);
|
||||||
|
|
||||||
|
const tz = new class extends Temporal.TimeZone {
|
||||||
|
#getPossibleInstantsForCalls = 0;
|
||||||
|
|
||||||
|
getPossibleInstantsFor(dt) {
|
||||||
|
this.#getPossibleInstantsForCalls++;
|
||||||
|
|
||||||
|
if (this.#getPossibleInstantsForCalls <= 2) {
|
||||||
|
return [new Temporal.Instant(86400_000_000_000n + 2n)]
|
||||||
|
}
|
||||||
|
return super.getPossibleInstantsFor(dt);
|
||||||
|
}
|
||||||
|
}("UTC");
|
||||||
|
|
||||||
|
const cal = new class extends Temporal.Calendar {
|
||||||
|
#dateUntilCalls = 0;
|
||||||
|
|
||||||
|
dateUntil(one, two, options) {
|
||||||
|
this.#dateUntilCalls++;
|
||||||
|
|
||||||
|
if (this.#dateUntilCalls === 1) {
|
||||||
|
return new Temporal.Duration(0, 0, 0, -2);
|
||||||
|
}
|
||||||
|
return super.dateUntil(one, two, options);
|
||||||
|
}
|
||||||
|
}("iso8601");
|
||||||
|
|
||||||
|
const relativeTo = new Temporal.ZonedDateTime(0n, tz, cal);
|
||||||
|
assert.throws(RangeError, () => instance.total({ relativeTo, unit: "days" }));
|
Loading…
Reference in New Issue