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:
4
NEWS
4
NEWS
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
18
ext/pgsql/tests/gh21162.phpt
Normal file
18
ext/pgsql/tests/gh21162.phpt
Normal 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
|
||||
Reference in New Issue
Block a user