diff --git a/doc/api/events.md b/doc/api/events.md index 5c0614b68bf2df..cb3ac491dcf200 100644 --- a/doc/api/events.md +++ b/doc/api/events.md @@ -262,7 +262,8 @@ By default, a maximum of `10` listeners can be registered for any single event. This limit can be changed for individual `EventEmitter` instances using the [`emitter.setMaxListeners(n)`][] method. To change the default for *all* `EventEmitter` instances, the `EventEmitter.defaultMaxListeners` -property can be used. +property can be used. If this value is not a positive number, a `TypeError` +will be thrown. Take caution when setting the `EventEmitter.defaultMaxListeners` because the change effects *all* `EventEmitter` instances, including those created before diff --git a/lib/events.js b/lib/events.js index ac080117665296..14a12046d3acff 100644 --- a/lib/events.js +++ b/lib/events.js @@ -56,6 +56,10 @@ Object.defineProperty(EventEmitter, 'defaultMaxListeners', { // force global console to be compiled. // see https://github.com/nodejs/node/issues/4467 console; + // check whether the input is a positive number (whose value is zero or + // greater and not a NaN). + if (typeof arg !== 'number' || arg < 0 || arg !== arg) + throw new TypeError('defaultMaxListeners must be a positive number'); defaultMaxListeners = arg; } }); diff --git a/test/parallel/test-event-emitter-max-listeners.js b/test/parallel/test-event-emitter-max-listeners.js index c0c763f2ad5322..59c42ec2038bd3 100644 --- a/test/parallel/test-event-emitter-max-listeners.js +++ b/test/parallel/test-event-emitter-max-listeners.js @@ -30,16 +30,13 @@ e.on('maxListeners', common.mustCall(function() {})); // Should not corrupt the 'maxListeners' queue. e.setMaxListeners(42); -assert.throws(function() { - e.setMaxListeners(NaN); -}, /^TypeError: "n" argument must be a positive number$/); +const throwsObjs = [NaN, -1, 'and even this']; -assert.throws(function() { - e.setMaxListeners(-1); -}, /^TypeError: "n" argument must be a positive number$/); - -assert.throws(function() { - e.setMaxListeners('and even this'); -}, /^TypeError: "n" argument must be a positive number$/); +for (const obj of throwsObjs) { + assert.throws(() => e.setMaxListeners(obj), + /^TypeError: "n" argument must be a positive number$/); + assert.throws(() => events.defaultMaxListeners = obj, + /^TypeError: defaultMaxListeners must be a positive number$/); +} e.emit('maxListeners');