diff options
-rw-r--r-- | ext/pgsql/pgsql.c | 20 | ||||
-rw-r--r-- | ext/pgsql/tests/bug75419.phpt | 14 |
2 files changed, 21 insertions, 13 deletions
diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 07dcff9cf2..c8909becd1 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -1572,32 +1572,26 @@ PHP_FUNCTION(pg_close) { zval *pgsql_link = NULL; zend_resource *link; - int argc = ZEND_NUM_ARGS(); - PGconn *pgsql; - if (zend_parse_parameters(argc, "|r", &pgsql_link) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|r", &pgsql_link) == FAILURE) { return; } - if (argc == 0) { + if (pgsql_link) { + link = Z_RES_P(pgsql_link); + } else { link = FETCH_DEFAULT_LINK(); CHECK_DEFAULT_LINK(link); - } else { - link = Z_RES_P(pgsql_link); } - if ((pgsql = (PGconn *)zend_fetch_resource2(link, "PostgreSQL link", le_link, le_plink)) == NULL) { + if (zend_fetch_resource2(link, "PostgreSQL link", le_link, le_plink) == NULL) { RETURN_FALSE; } - if (argc == 0) { /* explicit resource number */ - zend_list_close(link); - } - - if (argc || (pgsql_link && Z_RES_P(pgsql_link) == PGG(default_link))) { - zend_list_close(link); + if (link == PGG(default_link)) { PGG(default_link) = NULL; } + zend_list_close(link); RETURN_TRUE; } diff --git a/ext/pgsql/tests/bug75419.phpt b/ext/pgsql/tests/bug75419.phpt new file mode 100644 index 0000000000..09164f4221 --- /dev/null +++ b/ext/pgsql/tests/bug75419.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #75419 Default link leaked via pg_close() +--SKIPIF-- +<?php include("skipif.inc"); ?> +--FILE-- +<?php +include('config.inc'); + +$db1 = pg_connect($conn_str, PGSQL_CONNECT_FORCE_NEW); +$db2 = pg_connect($conn_str, PGSQL_CONNECT_FORCE_NEW); +pg_close($db1); +var_dump(pg_ping()); +--EXPECT-- +bool(true) |