summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/pgsql/pgsql.c20
-rw-r--r--ext/pgsql/tests/bug75419.phpt14
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)