From 7de8b49ad7d26dcb9f9fdd371ed6b99f596e03db Mon Sep 17 00:00:00 2001 From: Johan Levin Date: Wed, 15 Apr 2020 11:46:15 +0200 Subject: [PATCH] Refactor pg-pool to avoid potential memory leak Reduce the closure scope captured by the "release once" lambda function in _acquireClient so that it does not retain the pendingItem promise. --- packages/pg-pool/index.js | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/packages/pg-pool/index.js b/packages/pg-pool/index.js index 27875c1f..eef490f9 100644 --- a/packages/pg-pool/index.js +++ b/packages/pg-pool/index.js @@ -252,16 +252,7 @@ class Pool extends EventEmitter { this.emit('acquire', client) - let released = false - - client.release = (err) => { - if (released) { - throwOnDoubleRelease() - } - - released = true - this._release(client, idleListener, err) - } + client.release = this._releaseOnce(client, idleListener) client.removeListener('error', idleListener) @@ -287,6 +278,20 @@ class Pool extends EventEmitter { } } + // returns a function that wraps _release and throws if called more than once + _releaseOnce(client, idleListener) { + let released = false + + return (err) => { + if (released) { + throwOnDoubleRelease() + } + + released = true + this._release(client, idleListener, err) + } + } + // release a client back to the poll, include an error // to remove it from the pool _release(client, idleListener, err) {