summaryrefslogtreecommitdiff
path: root/lib/dgram.js
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2019-11-01 19:50:40 +0100
committerAnna Henningsen <anna@addaleax.net>2019-11-07 00:55:00 +0100
commit115792dfde436354c82f38361cbff75ad226b8d0 (patch)
tree3fb8f8172f866fcf24482908607cf1ab59fc2cfa /lib/dgram.js
parent99e874e545b7c69bbd22c93b7546037290a727d3 (diff)
downloadandroid-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.js17
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);