net: fix timeout with null handle
This commit handles the case where _onTimeout is called with a null handle. Refs: https://github.com/nodejs/node/pull/15791 Fixes: https://github.com/nodejs/node/issues/16484 PR-URL: https://github.com/nodejs/node/pull/16489 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com>
This commit is contained in:
parent
a78327f48b
commit
cecbb595d5
16
lib/net.js
16
lib/net.js
@ -397,13 +397,15 @@ Socket.prototype.setTimeout = function(msecs, callback) {
|
||||
|
||||
|
||||
Socket.prototype._onTimeout = function() {
|
||||
// `.prevWriteQueueSize` !== `.updateWriteQueueSize()` means there is
|
||||
// an active write in progress, so we suppress the timeout.
|
||||
const prevWriteQueueSize = this._handle.writeQueueSize;
|
||||
if (prevWriteQueueSize > 0 &&
|
||||
prevWriteQueueSize !== this._handle.updateWriteQueueSize()) {
|
||||
this._unrefTimer();
|
||||
return;
|
||||
if (this._handle) {
|
||||
// `.prevWriteQueueSize` !== `.updateWriteQueueSize()` means there is
|
||||
// an active write in progress, so we suppress the timeout.
|
||||
const prevWriteQueueSize = this._handle.writeQueueSize;
|
||||
if (prevWriteQueueSize > 0 &&
|
||||
prevWriteQueueSize !== this._handle.updateWriteQueueSize()) {
|
||||
this._unrefTimer();
|
||||
return;
|
||||
}
|
||||
}
|
||||
debug('_onTimeout');
|
||||
this.emit('timeout');
|
||||
|
17
test/parallel/test-net-timeout-no-handle.js
Normal file
17
test/parallel/test-net-timeout-no-handle.js
Normal file
@ -0,0 +1,17 @@
|
||||
'use strict';
|
||||
|
||||
const common = require('../common');
|
||||
const net = require('net');
|
||||
const assert = require('assert');
|
||||
|
||||
const socket = new net.Socket();
|
||||
socket.setTimeout(common.platformTimeout(50));
|
||||
|
||||
socket.on('timeout', common.mustCall(() => {
|
||||
assert.strictEqual(socket._handle, null);
|
||||
}));
|
||||
|
||||
socket.on('connect', common.mustNotCall());
|
||||
|
||||
// since the timeout is unrefed, the code will exit without this
|
||||
setTimeout(() => {}, common.platformTimeout(200));
|
Loading…
x
Reference in New Issue
Block a user