]> granicus.if.org Git - php/commitdiff
Bugfix#75419 Fix clearing of default link during pg_close()
authorSara Golemon <pollita@php.net>
Mon, 23 Oct 2017 18:41:44 +0000 (14:41 -0400)
committerSara Golemon <pollita@php.net>
Mon, 23 Oct 2017 18:44:00 +0000 (14:44 -0400)
ext/pgsql/pgsql.c
ext/pgsql/tests/bug75419.phpt [new file with mode: 0644]

index 34710b12bb45e558b867f12e512acae9469818b0..01af261bb51e500249ab84e714a7aa9cb82b2da5 100644 (file)
@@ -1562,32 +1562,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 (file)
index 0000000..09164f4
--- /dev/null
@@ -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)