1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Fix GH-21162: pg_connect() on error memory leak.

The PHP_PQ_ERROR macro calls php_error_docref() which triggers user error handlers
thus libpq does not have the chance to clean the resources (and empty
connections string are allowed) on failure thus we avoid this macro
and delay the error handling after.

close GH-21165
This commit is contained in:
David Carlier
2026-02-08 15:05:03 +00:00
parent 901ebd21f3
commit 539c5d9f76
3 changed files with 31 additions and 3 deletions

4
NEWS
View File

@@ -34,6 +34,10 @@ PHP NEWS
. Fixed bug GH-21055 (connection attribute status typo for GSS negotiation).
(lsaos)
- PGSQL:
. Fixed bug GH-21162 (pg_connect() memory leak on error).
(David Carlier)
- Sockets:
. Fixed bug GH-21161 (socket_set_option() crash with array 'addr'
entry as null). (David Carlier)

View File

@@ -705,10 +705,12 @@ static void php_pgsql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
/* create the link */
pgsql = PQconnectdb(connstring);
if (pgsql == NULL || PQstatus(pgsql) == CONNECTION_BAD) {
PHP_PQ_ERROR("Unable to connect to PostgreSQL server: %s", pgsql)
zend_string *msgbuf = _php_pgsql_trim_message(PQerrorMessage(pgsql));
if (pgsql) {
PQfinish(pgsql);
}
php_error_docref(NULL, E_WARNING, "Unable to connect to PostgreSQL server: %s", ZSTR_VAL(msgbuf));
zend_string_release(msgbuf);
goto err;
}
@@ -789,19 +791,23 @@ static void php_pgsql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
if (connect_type & PGSQL_CONNECT_ASYNC) {
pgsql = PQconnectStart(connstring);
if (pgsql==NULL || PQstatus(pgsql)==CONNECTION_BAD) {
PHP_PQ_ERROR("Unable to connect to PostgreSQL server: %s", pgsql);
zend_string *msgbuf = _php_pgsql_trim_message(PQerrorMessage(pgsql));
if (pgsql) {
PQfinish(pgsql);
}
php_error_docref(NULL, E_WARNING, "Unable to connect to PostgreSQL server: %s", ZSTR_VAL(msgbuf));
zend_string_release(msgbuf);
goto err;
}
} else {
pgsql = PQconnectdb(connstring);
if (pgsql==NULL || PQstatus(pgsql)==CONNECTION_BAD) {
PHP_PQ_ERROR("Unable to connect to PostgreSQL server: %s", pgsql);
zend_string *msgbuf = _php_pgsql_trim_message(PQerrorMessage(pgsql));
if (pgsql) {
PQfinish(pgsql);
}
php_error_docref(NULL, E_WARNING, "Unable to connect to PostgreSQL server: %s", ZSTR_VAL(msgbuf));
zend_string_release(msgbuf);
goto err;
}
}

View File

@@ -0,0 +1,18 @@
--TEST--
GH-21162 (pg_connect() on error memory leak)
--EXTENSIONS--
pgsql
--FILE--
<?php
set_error_handler(function (int $errno, string $errstr) {
echo "Warning caught\n";
});
pg_connect('');
echo "Done\n";
?>
--EXPECT--
Warning caught
Done