From 71aabedad422748e67d1aab18742d03b829d95c9 Mon Sep 17 00:00:00 2001 From: Jeremy Martin Date: Fri, 22 Nov 2013 09:17:16 -0500 Subject: [PATCH] events: fix TypeError in removeAllListeners Check that `listeners` is actually an array before trying to manipulate it because it won't be if no regular event listeners have been registered yet but there are 'removeListener' event listeners. --- lib/events.js | 2 +- test/simple/test-event-emitter-remove-all-listeners.js | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/events.js b/lib/events.js index f43df093d49..781748ba88f 100644 --- a/lib/events.js +++ b/lib/events.js @@ -263,7 +263,7 @@ EventEmitter.prototype.removeAllListeners = function(type) { if (typeof listeners === 'function') { this.removeListener(type, listeners); - } else { + } else if (Array.isArray(listeners)) { // LIFO order while (listeners.length) this.removeListener(type, listeners[listeners.length - 1]); diff --git a/test/simple/test-event-emitter-remove-all-listeners.js b/test/simple/test-event-emitter-remove-all-listeners.js index 2cd31ebd261..f9848d68231 100644 --- a/test/simple/test-event-emitter-remove-all-listeners.js +++ b/test/simple/test-event-emitter-remove-all-listeners.js @@ -71,3 +71,10 @@ e2.removeAllListeners(); console.error(e2); assert.deepEqual([], e2.listeners('foo')); assert.deepEqual([], e2.listeners('bar')); + +var e3 = new events.EventEmitter(); +e3.on('removeListener', listener); +// check for regression where removeAllListeners throws when +// there exists a removeListener listener, but there exists +// no listeners for the provided event type +assert.doesNotThrow(e3.removeAllListeners.bind(e3, 'foo'));