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

Commit 82d28f3

Browse files
author
Shigeki Ohtsu
committed
timer: fix leak of domain members in setTimeout()
1 parent 054740e commit 82d28f3

File tree

2 files changed

+68
-2
lines changed

2 files changed

+68
-2
lines changed

lib/timers.js

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,20 @@ exports.setTimeout = function(callback, after) {
176176
timer._idlePrev = timer;
177177
timer._idleNext = timer;
178178

179+
function removeDomain() {
180+
var domain = require('domain');
181+
if (domain.active) {
182+
domain.active.remove(timer);
183+
}
184+
}
185+
179186
if (arguments.length <= 2) {
180-
timer._onTimeout = callback;
187+
timer._onTimeout = function() {
188+
callback();
189+
if (exports.usingDomains) {
190+
removeDomain();
191+
}
192+
};
181193
} else {
182194
/*
183195
* Sometimes setTimeout is called with arguments, EG
@@ -191,7 +203,10 @@ exports.setTimeout = function(callback, after) {
191203
var args = Array.prototype.slice.call(arguments, 2);
192204
timer._onTimeout = function() {
193205
callback.apply(timer, args);
194-
}
206+
if (exports.usingDomains) {
207+
rmoveDomain();
208+
}
209+
};
195210
}
196211

197212
if (exports.usingDomains) {
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright Joyent, Inc. and other Node contributors.
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a
4+
// copy of this software and associated documentation files (the
5+
// "Software"), to deal in the Software without restriction, including
6+
// without limitation the rights to use, copy, modify, merge, publish,
7+
// distribute, sublicense, and/or sell copies of the Software, and to permit
8+
// persons to whom the Software is furnished to do so, subject to the
9+
// following conditions:
10+
//
11+
// The above copyright notice and this permission notice shall be included
12+
// in all copies or substantial portions of the Software.
13+
//
14+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15+
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16+
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17+
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19+
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20+
// USE OR OTHER DEALINGS IN THE SOFTWARE.
21+
22+
var assert = require('assert');
23+
var common = require('../common.js');
24+
var http = require('http');
25+
var domain = require('domain');
26+
var d = domain.create();
27+
var ncounter = 0;
28+
29+
d.on('error', function(err) {
30+
assert.strictEqual(err.domain.members.length, 1);
31+
ncounter++;
32+
if (ncounter === 2) {
33+
server.close();
34+
}
35+
});
36+
37+
var server = http.createServer(d.bind(function(req, res) {
38+
res.writeHead(200, {'Content-Type': 'text/plain'});
39+
res.end('Hello');
40+
throw new Error('error');
41+
})).listen(common.PORT, function() {
42+
var options = {
43+
host: '127.0.0.1',
44+
port: common.PORT,
45+
path: '/'
46+
};
47+
http.get(options);
48+
setTimeout(function() {
49+
http.get(options);
50+
}, 1100);
51+
});

0 commit comments

Comments
 (0)