Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

net: throw on invalid socket timeouts #8884

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions lib/net.js
Original file line number Diff line number Diff line change
Expand Up @@ -319,17 +319,17 @@ Socket.prototype.listen = function() {


Socket.prototype.setTimeout = function(msecs, callback) {
if (msecs > 0 && isFinite(msecs)) {
if (msecs === 0) {
timers.unenroll(this);
if (callback) {
this.removeListener('timeout', callback);
}
} else {
timers.enroll(this, msecs);
timers._unrefActive(this);
if (callback) {
this.once('timeout', callback);
}
} else if (msecs === 0) {
timers.unenroll(this);
if (callback) {
this.removeListener('timeout', callback);
}
}
};

Expand Down
15 changes: 12 additions & 3 deletions lib/timers.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ var kOnTimeout = Timer.kOnTimeout | 0;
// Timeout values > TIMEOUT_MAX are set to 1.
var TIMEOUT_MAX = 2147483647; // 2^31-1

var debug = require('util').debuglog('timer');
var util = require('util');
var debug = util.debuglog('timer');


// IDLE TIMEOUTS
Expand Down Expand Up @@ -151,13 +152,21 @@ var unenroll = exports.unenroll = function(item) {

// Does not start the time, just sets up the members needed.
exports.enroll = function(item, msecs) {
if (!util.isNumber(msecs)) {
throw new TypeError('msecs must be a number');
}

if (msecs < 0 || !isFinite(msecs)) {
throw new RangeError('msecs must be a non-negative finite number');
}

// if this item was already in a list somewhere
// then we should unenroll it from that
if (item._idleNext) unenroll(item);

// Ensure that msecs fits into signed int32
if (msecs > 0x7fffffff) {
msecs = 0x7fffffff;
if (msecs > TIMEOUT_MAX) {
msecs = TIMEOUT_MAX;
}

item._idleTimeout = msecs;
Expand Down
2 changes: 1 addition & 1 deletion test/simple/test-net-settimeout.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ var server = net.createServer(function(c) {
});
server.listen(common.PORT);

var killers = [0, Infinity, NaN];
var killers = [0];

var left = killers.length;
killers.forEach(function(killer) {
Expand Down
25 changes: 25 additions & 0 deletions test/simple/test-net-socket-timeout.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,31 @@ var common = require('../common');
var net = require('net');
var assert = require('assert');

// Verify that invalid delays throw
var noop = function() {};
var s = new net.Socket();
var nonNumericDelays = ['100', true, false, undefined, null, '', {}, noop, []];
var badRangeDelays = [-0.001, -1, -Infinity, Infinity, NaN];
var validDelays = [0, 0.001, 1, 1e6];

for (var i = 0; i < nonNumericDelays.length; i++) {
assert.throws(function() {
s.setTimeout(nonNumericDelays[i], noop);
}, TypeError);
}

for (var i = 0; i < badRangeDelays.length; i++) {
assert.throws(function() {
s.setTimeout(badRangeDelays[i], noop);
}, RangeError);
}

for (var i = 0; i < validDelays.length; i++) {
assert.doesNotThrow(function() {
s.setTimeout(validDelays[i], noop);
});
}

var timedout = false;

var server = net.Server();
Expand Down