mirror of
https://github.com/nodejs/node.git
synced 2025-05-06 16:46:56 +00:00

Commit 934bfe23a1
had introduced a
regression where node would crash trying to access a null unref timer if
a given unref timer's callback would remove other unref timers set to
fire in the future.
More generally, it makes the unrefTimeout function more solid by not
mutating the unrefList while traversing it.
Fixes: https://github.com/joyent/node/issues/8897
Conflicts:
lib/timers.js
Fixes: https://github.com/nodejs/node-convergence-archive/issues/23
Ref: https://github.com/nodejs/node/issues/268
PR-URL: https://github.com/nodejs/node/pull/2540
Reviewed-By: bnoordhuis - Ben Noordhuis <info@bnoordhuis.nl>
51 lines
1.3 KiB
JavaScript
51 lines
1.3 KiB
JavaScript
'use strict';
|
|
|
|
/*
|
|
* This test is a regression test for joyent/node#8897.
|
|
*/
|
|
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
const net = require('net');
|
|
|
|
const clients = [];
|
|
|
|
const server = net.createServer(function onClient(client) {
|
|
clients.push(client);
|
|
|
|
if (clients.length === 2) {
|
|
/*
|
|
* Enroll two timers, and make the one supposed to fire first
|
|
* unenroll the other one supposed to fire later. This mutates
|
|
* the list of unref timers when traversing it, and exposes the
|
|
* original issue in joyent/node#8897.
|
|
*/
|
|
clients[0].setTimeout(1, function onTimeout() {
|
|
clients[1].setTimeout(0);
|
|
clients[0].end();
|
|
clients[1].end();
|
|
});
|
|
|
|
// Use a delay that is higher than the lowest timer resolution accross all
|
|
// supported platforms, so that the two timers don't fire at the same time.
|
|
clients[1].setTimeout(50);
|
|
}
|
|
});
|
|
|
|
server.listen(common.PORT, common.localhostIPv4, function() {
|
|
var nbClientsEnded = 0;
|
|
|
|
function addEndedClient(client) {
|
|
++nbClientsEnded;
|
|
if (nbClientsEnded === 2) {
|
|
server.close();
|
|
}
|
|
};
|
|
|
|
const client1 = net.connect({ port: common.PORT });
|
|
client1.on('end', addEndedClient);
|
|
|
|
const client2 = net.connect({ port: common.PORT });
|
|
client2.on('end', addEndedClient);
|
|
});
|