Skip to content

Commit b55715d

Browse files
committed
Fix use after free on pg_close() of default connection
1 parent 7b8212f commit b55715d

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

ext/pgsql/pgsql.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
#define PQ_SETNONBLOCKING(pg_link, flag) 0
9191
#endif
9292

93-
#define CHECK_DEFAULT_LINK(x) if ((x) == NULL) { php_error_docref(NULL, E_WARNING, "No PostgreSQL link opened yet"); }
93+
#define CHECK_DEFAULT_LINK(x) if ((x) == NULL) { php_error_docref(NULL, E_WARNING, "No PostgreSQL link opened yet"); RETURN_FALSE; }
9494
#define FETCH_DEFAULT_LINK() PGG(default_link)
9595

9696
#ifndef HAVE_PQFREEMEM
@@ -1559,13 +1559,15 @@ PHP_FUNCTION(pg_close)
15591559
return;
15601560
}
15611561

1562-
if (pgsql_link) {
1563-
link = Z_RES_P(pgsql_link);
1564-
} else {
1565-
link = FETCH_DEFAULT_LINK();
1562+
if (!pgsql_link) {
1563+
link = PGG(default_link);
15661564
CHECK_DEFAULT_LINK(link);
1565+
zend_list_delete(link);
1566+
PGG(default_link) = NULL;
1567+
RETURN_TRUE;
15671568
}
15681569

1570+
link = Z_RES_P(pgsql_link);
15691571
if (zend_fetch_resource2(link, "PostgreSQL link", le_link, le_plink) == NULL) {
15701572
RETURN_FALSE;
15711573
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
pg_close() default link after connection variable has been dropped
3+
--SKIPIF--
4+
<?php include("skipif.inc"); ?>
5+
--FILE--
6+
<?php
7+
include('config.inc');
8+
9+
/* Run me under valgrind */
10+
$db1 = pg_connect($conn_str);
11+
unset($db1);
12+
var_dump(pg_close());
13+
?>
14+
--EXPECT--
15+
bool(true)

0 commit comments

Comments
 (0)