Skip to content

Commit a09e2fd

Browse files
apapirovskiMylesBorins
authored andcommitted
net: fix timeout with null handle
This commit handles the case where _onTimeout is called with a null handle. Backport-PR-URL: #16420 Refs: #15791 Fixes: #16484 PR-URL: #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>
1 parent a301c1a commit a09e2fd

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
lines changed

lib/net.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -334,13 +334,15 @@ Socket.prototype.setTimeout = function(msecs, callback) {
334334

335335

336336
Socket.prototype._onTimeout = function() {
337-
// `.prevWriteQueueSize` !== `.updateWriteQueueSize()` means there is
338-
// an active write in progress, so we suppress the timeout.
339-
const prevWriteQueueSize = this._handle.writeQueueSize;
340-
if (prevWriteQueueSize > 0 &&
341-
prevWriteQueueSize !== this._handle.updateWriteQueueSize()) {
342-
this._unrefTimer();
343-
return;
337+
if (this._handle) {
338+
// `.prevWriteQueueSize` !== `.updateWriteQueueSize()` means there is
339+
// an active write in progress, so we suppress the timeout.
340+
const prevWriteQueueSize = this._handle.writeQueueSize;
341+
if (prevWriteQueueSize > 0 &&
342+
prevWriteQueueSize !== this._handle.updateWriteQueueSize()) {
343+
this._unrefTimer();
344+
return;
345+
}
344346
}
345347
debug('_onTimeout');
346348
this.emit('timeout');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const net = require('net');
5+
const assert = require('assert');
6+
7+
const socket = new net.Socket();
8+
socket.setTimeout(common.platformTimeout(50));
9+
10+
socket.on('timeout', common.mustCall(() => {
11+
assert.strictEqual(socket._handle, null);
12+
}));
13+
14+
socket.on('connect', common.mustNotCall());
15+
16+
// since the timeout is unrefed, the code will exit without this
17+
setTimeout(() => {}, common.platformTimeout(200));

0 commit comments

Comments
 (0)