summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorKeyur <kgovande@etsy.com>2016-08-09 14:01:25 +0000
committerKeyur <kgovande@etsy.com>2016-08-09 14:01:25 +0000
commit98e4d509f67f371b52e476ec252ef7c12b685549 (patch)
tree0446dce73f33f34c7107b9e334745040c9bc41e0 /ext
parent3c5e6b29ce0e0f495a96c7878b23ca00a34c44d7 (diff)
downloadphp-git-98e4d509f67f371b52e476ec252ef7c12b685549.tar.gz
Bugfix 72791: fix memory leak in PDO persistent connections
Diffstat (limited to 'ext')
-rw-r--r--ext/pdo/pdo_dbh.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c
index 8a7c1d3931..7a49a03ed1 100644
--- a/ext/pdo/pdo_dbh.c
+++ b/ext/pdo/pdo_dbh.c
@@ -297,7 +297,7 @@ static PHP_METHOD(PDO, dbh_constructor)
/* is the connection still alive ? */
if (pdbh->methods->check_liveness && FAILURE == (pdbh->methods->check_liveness)(pdbh)) {
/* nope... need to kill it */
- /*??? memory leak */
+ pdbh->refcount--;
zend_list_close(le);
pdbh = NULL;
}
@@ -310,6 +310,7 @@ static PHP_METHOD(PDO, dbh_constructor)
/* need a brand new pdbh */
pdbh = pecalloc(1, sizeof(*pdbh), 1);
+ pdbh->refcount = 1;
pdbh->is_persistent = 1;
pdbh->persistent_id = pemalloc(plen + 1, 1);
memcpy((char *)pdbh->persistent_id, hashkey, plen+1);
@@ -322,6 +323,7 @@ static PHP_METHOD(PDO, dbh_constructor)
efree(dbh);
/* switch over to the persistent one */
Z_PDO_OBJECT_P(object)->inner = pdbh;
+ pdbh->refcount++;
dbh = pdbh;
}
@@ -1508,8 +1510,13 @@ static void dbh_free(pdo_dbh_t *dbh, zend_bool free_persistent)
dbh->query_stmt = NULL;
}
- if (dbh->is_persistent && !free_persistent) {
- return;
+ if (dbh->is_persistent) {
+#if ZEND_DEBUG
+ ZEND_ASSERT(free_persistent && (dbh->refcount == 1));
+#endif
+ if (!free_persistent && (--dbh->refcount)) {
+ return;
+ }
}
if (dbh->methods) {