Permalink
Browse files

net: fix timeout with null handle

This commit handles the case where _onTimeout is called with a
null handle.

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>
  • Loading branch information...
apapirovski authored and cjihrig committed Oct 25, 2017
1 parent a441f1a commit 655e017e40efea7e6a90f3226f3cf861e4b23b4a
Showing with 26 additions and 7 deletions.
  1. +9 −7 lib/net.js
  2. +17 −0 test/parallel/test-net-timeout-no-handle.js
View
@@ -396,13 +396,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');
@@ -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));

0 comments on commit 655e017

Please sign in to comment.