Skip to content

Commit ee9cd00

Browse files
committed
lib: fix TypeError with EventEmitter#on() abuse
Commit 2931348 added EventEmitter#getMaxListeners() but introduced a regression when people abuse EventEmitter.prototype.on.call() to call EventEmitter#on() on a non-EE object. Add a workaround for that. Fixes: nodejs#523 PR-URL: nodejs#527 Reviewed-By: Colin Ihrig <[email protected]>
1 parent 77d6807 commit ee9cd00

File tree

2 files changed

+13
-5
lines changed

2 files changed

+13
-5
lines changed

lib/events.js

+8-5
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,14 @@ EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
4646
return this;
4747
};
4848

49-
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
50-
if (!util.isUndefined(this._maxListeners))
51-
return this._maxListeners;
52-
else
49+
function $getMaxListeners(that) {
50+
if (util.isUndefined(that._maxListeners))
5351
return EventEmitter.defaultMaxListeners;
52+
return that._maxListeners;
53+
}
54+
55+
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
56+
return $getMaxListeners(this);
5457
};
5558

5659
EventEmitter.prototype.emit = function emit(type) {
@@ -151,7 +154,7 @@ EventEmitter.prototype.addListener = function addListener(type, listener) {
151154

152155
// Check for listener leak
153156
if (util.isObject(this._events[type]) && !this._events[type].warned) {
154-
var m = this.getMaxListeners();
157+
var m = $getMaxListeners(this);
155158
if (m && m > 0 && this._events[type].length > m) {
156159
this._events[type].warned = true;
157160
console.error('(node) warning: possible EventEmitter memory ' +

test/parallel/test-event-emitter-get-max-listeners.js

+5
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,8 @@ assert.strictEqual(emitter.getMaxListeners(), 0);
1111

1212
emitter.setMaxListeners(3);
1313
assert.strictEqual(emitter.getMaxListeners(), 3);
14+
15+
// https://github.com/iojs/io.js/issues/523 - second call should not throw.
16+
var recv = {};
17+
EventEmitter.prototype.on.call(recv, 'event', function() {});
18+
EventEmitter.prototype.on.call(recv, 'event', function() {});

0 commit comments

Comments
 (0)