diff options
author | Anna Henningsen <anna@addaleax.net> | 2019-11-01 19:50:40 +0100 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2019-11-07 00:55:00 +0100 |
commit | 115792dfde436354c82f38361cbff75ad226b8d0 (patch) | |
tree | 3fb8f8172f866fcf24482908607cf1ab59fc2cfa /lib/dgram.js | |
parent | 99e874e545b7c69bbd22c93b7546037290a727d3 (diff) | |
download | android-node-v8-115792dfde436354c82f38361cbff75ad226b8d0.tar.gz android-node-v8-115792dfde436354c82f38361cbff75ad226b8d0.tar.bz2 android-node-v8-115792dfde436354c82f38361cbff75ad226b8d0.zip |
dgram: remove listeners on bind error
This avoids piling up `'listening'` event listeners if
`.bind()` fails repeatedly.
Fixes: https://github.com/nodejs/node/issues/30209
PR-URL: https://github.com/nodejs/node/pull/30210
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'lib/dgram.js')
-rw-r--r-- | lib/dgram.js | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/dgram.js b/lib/dgram.js index 35d414320a..94f44d5202 100644 --- a/lib/dgram.js +++ b/lib/dgram.js @@ -211,8 +211,21 @@ Socket.prototype.bind = function(port_, address_ /* , callback */) { state.bindState = BIND_STATE_BINDING; - if (arguments.length && typeof arguments[arguments.length - 1] === 'function') - this.once('listening', arguments[arguments.length - 1]); + const cb = arguments.length && arguments[arguments.length - 1]; + if (typeof cb === 'function') { + function removeListeners() { + this.removeListener('error', removeListeners); + this.removeListener('listening', onListening); + } + + function onListening() { + removeListeners.call(this); + cb.call(this); + } + + this.on('error', removeListeners); + this.on('listening', onListening); + } if (port instanceof UDP) { replaceHandle(this, port); |