From c0d9f3925285ecb6c4a39cc49e539592b14baee9 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Thu, 9 Oct 2025 20:13:33 +0100 Subject: [PATCH 1/2] host_info() dumps with assert after failed reconnect --- ext/mysqli/mysqli_prop.c | 30 +++++++++++---- .../mysqli_incomplete_initialization2.phpt | 38 +++++++++++++++++++ 2 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 ext/mysqli/tests/mysqli_incomplete_initialization2.phpt diff --git a/ext/mysqli/mysqli_prop.c b/ext/mysqli/mysqli_prop.c index 6d86a6ad4ca8..3f4df2a0cf84 100644 --- a/ext/mysqli/mysqli_prop.c +++ b/ext/mysqli/mysqli_prop.c @@ -35,15 +35,29 @@ #define MYSQLI_GET_MYSQL(statusval) \ MYSQL *p; \ -if (!obj->ptr || !(MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr) { \ - if (!quiet) { \ - zend_throw_error(NULL, "%s object is already closed", ZSTR_VAL(obj->zo.ce->name)); \ +{ \ + MYSQLI_RESOURCE *my_res = obj->ptr; \ + MY_MYSQL *my_mysql; \ + if (!my_res || !(my_mysql = (MY_MYSQL *)my_res->ptr)) { \ + if (!quiet) { \ + zend_throw_error(NULL, "%s object is already closed", ZSTR_VAL(obj->zo.ce->name)); \ + } \ + return FAILURE; \ } \ - return FAILURE; \ -} else { \ - CHECK_STATUS(statusval, quiet);\ - p = (MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->mysql;\ -} + if (my_res->status < statusval ) { \ + if (!quiet) { \ + zend_throw_error(NULL, "Property access is not allowed yet"); \ + } \ + return FAILURE; \ + } \ + p = (MYSQL *)my_mysql->mysql;\ + if (!p) { \ + if (!quiet) { \ + zend_throw_error(NULL, "%s object is not fully initialized", ZSTR_VAL(obj->zo.ce->name)); \ + } \ + return FAILURE; \ + } \ +} \ #define MYSQLI_GET_RESULT(statusval) \ MYSQL_RES *p; \ diff --git a/ext/mysqli/tests/mysqli_incomplete_initialization2.phpt b/ext/mysqli/tests/mysqli_incomplete_initialization2.phpt new file mode 100644 index 000000000000..6c73665291aa --- /dev/null +++ b/ext/mysqli/tests/mysqli_incomplete_initialization2.phpt @@ -0,0 +1,38 @@ +--TEST-- +host_info() dumps with assert after failed reconnect +--EXTENSIONS-- +mysqli +--SKIPIF-- + +--FILE-- +connect($host, $user, $passwd, $db, $port, $socket); + +echo 'Success... ' . $mysqli->host_info . "\n"; + +try { + $mysqli->connect($host, $user, $passwd, $db.'wrong', $port, $socket); +} catch (mysqli_sql_exception $e) { + echo "Error: " . $e->getMessage() . "\n"; +} + +try { + echo $mysqli->host_info . "\n"; +} catch (Error $e) { + echo "Error: " . $e->getMessage() . "\n"; +} + +print "done!"; +?> +--EXPECTF-- +Success... %s via %s +Error: Unknown database 'testwrong' +Error: mysqli object is not fully initialized +done! From 1aaef679a8e07c8d649a0d2fa9c588ed28501010 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Thu, 23 Apr 2026 18:07:25 +0100 Subject: [PATCH 2/2] Add NEWS --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index b110b17bef21..f44082a61f0d 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.4.22 +- mysqli: + . Fixed failed assertion when accessing mysqli property after failed + reconnection. (Kamil Tekiela) + 07 May 2026, PHP 8.4.21