From 2484c5b158aa03eb5d7a106126f74146697f57bd Mon Sep 17 00:00:00 2001 From: cjihrig Date: Mon, 28 May 2018 17:03:12 -0400 Subject: [PATCH] events: prevent undefined as an event name This commit prevents undefined as an event name in addListener(), removeListener(), and emit(). --- lib/events.js | 14 ++++++++++++++ test/parallel/test-event-emitter-add-listeners.js | 11 +++++++++++ test/parallel/test-event-emitter-errors.js | 10 ++++++++++ .../test-event-emitter-remove-listeners.js | 11 +++++++++++ 4 files changed, 46 insertions(+) diff --git a/lib/events.js b/lib/events.js index ff1648d6aa13e7..1a0f7f078992cc 100644 --- a/lib/events.js +++ b/lib/events.js @@ -138,6 +138,8 @@ function enhanceStackTrace(err, own) { } EventEmitter.prototype.emit = function emit(type, ...args) { + validateEventName(type, 'eventName'); + let doError = (type === 'error'); const events = this._events; @@ -200,6 +202,7 @@ function _addListener(target, type, listener, prepend) { throw new errors.ERR_INVALID_ARG_TYPE('listener', 'Function', listener); } + validateEventName(type, 'eventName'); events = target._events; if (events === undefined) { events = target._events = Object.create(null); @@ -311,6 +314,7 @@ EventEmitter.prototype.removeListener = throw new errors.ERR_INVALID_ARG_TYPE('listener', 'Function', listener); } + validateEventName(type, 'eventName'); events = this._events; if (events === undefined) return this; @@ -480,3 +484,13 @@ function unwrapListeners(arr) { } return ret; } + +function validateEventName(name, paramName) { + if (name === undefined) { + const { ERR_INVALID_ARG_TYPE } = lazyErrors(); + const err = new ERR_INVALID_ARG_TYPE(paramName, ['string', 'symbol'], name); + + Error.captureStackTrace(err, validateEventName); + throw err; + } +} diff --git a/test/parallel/test-event-emitter-add-listeners.js b/test/parallel/test-event-emitter-add-listeners.js index 45bfd3832caaaf..0c7740b358f48d 100644 --- a/test/parallel/test-event-emitter-add-listeners.js +++ b/test/parallel/test-event-emitter-add-listeners.js @@ -95,3 +95,14 @@ common.expectsError(() => { message: 'The "listener" argument must be of type Function. ' + 'Received type object' }); + +// Verify that the event type cannot be undefined. +common.expectsError(() => { + const ee = new EventEmitter(); + ee.on(undefined, () => {}); +}, { + code: 'ERR_INVALID_ARG_TYPE', + type: TypeError, + message: 'The "eventName" argument must be one of type string or symbol. ' + + 'Received type undefined' +}); diff --git a/test/parallel/test-event-emitter-errors.js b/test/parallel/test-event-emitter-errors.js index ef2bbee93f8bfd..cd6e3dc3e30ba3 100644 --- a/test/parallel/test-event-emitter-errors.js +++ b/test/parallel/test-event-emitter-errors.js @@ -21,3 +21,13 @@ common.expectsError( message: 'Unhandled error. ([object Object])' } ); + +// Verify that the event type cannot be undefined. +common.expectsError(() => { + EE.emit(undefined, new Error()); +}, { + code: 'ERR_INVALID_ARG_TYPE', + type: TypeError, + message: 'The "eventName" argument must be one of type string or symbol. ' + + 'Received type undefined' +}); diff --git a/test/parallel/test-event-emitter-remove-listeners.js b/test/parallel/test-event-emitter-remove-listeners.js index 925f828f93da36..4af966f35ebf12 100644 --- a/test/parallel/test-event-emitter-remove-listeners.js +++ b/test/parallel/test-event-emitter-remove-listeners.js @@ -154,6 +154,17 @@ common.expectsError(() => { 'Received type object' }); +// Verify that the event type cannot be undefined. +common.expectsError(() => { + const ee = new EventEmitter(); + ee.removeListener(undefined, () => {}); +}, { + code: 'ERR_INVALID_ARG_TYPE', + type: TypeError, + message: 'The "eventName" argument must be one of type string or symbol. ' + + 'Received type undefined' +}); + { const ee = new EventEmitter(); const listener = () => {};