Skip to content

Commit 0cff052

Browse files
committed
net: throw on invalid socket timeouts
This commit restricts socket timeouts non-negative, finite numbers. Any other value throws a TypeError or RangeError. This prevents subtle bugs that can happen due to type coercion. Fixes: nodejs/node-v0.x-archive#8618 PR-URL: nodejs/node-v0.x-archive#8884 Reviewed-By: Trevor Norris <[email protected]> Reviewed-By: Timothy J Fontaine <[email protected]> Conflicts: lib/timers.js test/simple/test-net-settimeout.js test/simple/test-net-socket-timeout.js
1 parent ba40942 commit 0cff052

File tree

4 files changed

+44
-13
lines changed

4 files changed

+44
-13
lines changed

lib/net.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -300,17 +300,17 @@ Socket.prototype.listen = function() {
300300

301301

302302
Socket.prototype.setTimeout = function(msecs, callback) {
303-
if (msecs > 0 && isFinite(msecs)) {
303+
if (msecs === 0) {
304+
timers.unenroll(this);
305+
if (callback) {
306+
this.removeListener('timeout', callback);
307+
}
308+
} else {
304309
timers.enroll(this, msecs);
305310
timers._unrefActive(this);
306311
if (callback) {
307312
this.once('timeout', callback);
308313
}
309-
} else if (msecs === 0) {
310-
timers.unenroll(this);
311-
if (callback) {
312-
this.removeListener('timeout', callback);
313-
}
314314
}
315315
};
316316

lib/timers.js

+12-6
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@
33
const Timer = process.binding('timer_wrap').Timer;
44
const L = require('_linklist');
55
const assert = require('assert').ok;
6-
6+
const util = require('util');
7+
const debug = util.debuglog('timer');
78
const kOnTimeout = Timer.kOnTimeout | 0;
89

910
// Timeout values > TIMEOUT_MAX are set to 1.
1011
const TIMEOUT_MAX = 2147483647; // 2^31-1
1112

12-
const debug = require('util').debuglog('timer');
13-
14-
1513
// IDLE TIMEOUTS
1614
//
1715
// Because often many sockets will have the same idle timeout we will not
@@ -132,13 +130,21 @@ const unenroll = exports.unenroll = function(item) {
132130

133131
// Does not start the time, just sets up the members needed.
134132
exports.enroll = function(item, msecs) {
133+
if (typeof msecs !== 'number') {
134+
throw new TypeError('msecs must be a number');
135+
}
136+
137+
if (msecs < 0 || !isFinite(msecs)) {
138+
throw new RangeError('msecs must be a non-negative finite number');
139+
}
140+
135141
// if this item was already in a list somewhere
136142
// then we should unenroll it from that
137143
if (item._idleNext) unenroll(item);
138144

139145
// Ensure that msecs fits into signed int32
140-
if (msecs > 0x7fffffff) {
141-
msecs = 0x7fffffff;
146+
if (msecs > TIMEOUT_MAX) {
147+
msecs = TIMEOUT_MAX;
142148
}
143149

144150
item._idleTimeout = msecs;

test/parallel/test-net-settimeout.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var server = net.createServer(function(c) {
1212
});
1313
server.listen(common.PORT);
1414

15-
var killers = [0, Infinity, NaN];
15+
var killers = [0];
1616

1717
var left = killers.length;
1818
killers.forEach(function(killer) {

test/parallel/test-net-socket-timeout.js

+25
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,31 @@ var common = require('../common');
22
var net = require('net');
33
var assert = require('assert');
44

5+
// Verify that invalid delays throw
6+
var noop = function() {};
7+
var s = new net.Socket();
8+
var nonNumericDelays = ['100', true, false, undefined, null, '', {}, noop, []];
9+
var badRangeDelays = [-0.001, -1, -Infinity, Infinity, NaN];
10+
var validDelays = [0, 0.001, 1, 1e6];
11+
12+
for (var i = 0; i < nonNumericDelays.length; i++) {
13+
assert.throws(function() {
14+
s.setTimeout(nonNumericDelays[i], noop);
15+
}, TypeError);
16+
}
17+
18+
for (var i = 0; i < badRangeDelays.length; i++) {
19+
assert.throws(function() {
20+
s.setTimeout(badRangeDelays[i], noop);
21+
}, RangeError);
22+
}
23+
24+
for (var i = 0; i < validDelays.length; i++) {
25+
assert.doesNotThrow(function() {
26+
s.setTimeout(validDelays[i], noop);
27+
});
28+
}
29+
530
var timedout = false;
631

732
var server = net.Server();

0 commit comments

Comments
 (0)