timers: be more defensive with intervals
It's possible for user-code to flip an existing timeout to be an interval during its execution, in which case the current code would crash due to start being undefined. Fix this by providing a default start value within rearm. PR-URL: https://github.com/nodejs/node/pull/18579 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
parent
1b05d7bc86
commit
568b6a5c9e
@ -442,8 +442,7 @@ function ontimeout(timer, start) {
|
|||||||
rearm(timer, start);
|
rearm(timer, start);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function rearm(timer, start = TimerWrap.now()) {
|
||||||
function rearm(timer, start) {
|
|
||||||
// // Do not re-arm unenroll'd or closed timers.
|
// // Do not re-arm unenroll'd or closed timers.
|
||||||
if (timer._idleTimeout === -1) return;
|
if (timer._idleTimeout === -1) return;
|
||||||
|
|
||||||
|
12
test/parallel/test-timers-timeout-to-interval.js
Normal file
12
test/parallel/test-timers-timeout-to-interval.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
'use strict';
|
||||||
|
const common = require('../common');
|
||||||
|
|
||||||
|
// This isn't officially supported but nonetheless is something that is
|
||||||
|
// currently possible and as such it shouldn't cause the process to crash
|
||||||
|
|
||||||
|
const t = setTimeout(common.mustCall(() => {
|
||||||
|
if (t._repeat) {
|
||||||
|
clearInterval(t);
|
||||||
|
}
|
||||||
|
t._repeat = true;
|
||||||
|
}, 2), 1);
|
Loading…
x
Reference in New Issue
Block a user