diff --git a/NEWS b/NEWS index 376139b086feb..894ef13456b27 100644 --- a/NEWS +++ b/NEWS @@ -48,6 +48,10 @@ PHP NEWS - MBString: . Fixed bug GH-17112 (Macro redefinitions). (nielsdos, cmb) +- mysqli: + . Fixed failed assertion when accessing mysqli property after failed + reconnection. (Kamil Tekiela) + - Opcache: . opcache_get_configuration() properly reports jit_prof_threshold. (cmb) diff --git a/ext/mysqli/mysqli_prop.c b/ext/mysqli/mysqli_prop.c index 279a93b3d3992..d90785a0c8192 100644 --- a/ext/mysqli/mysqli_prop.c +++ b/ext/mysqli/mysqli_prop.c @@ -37,15 +37,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 0000000000000..6c73665291aaf --- /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!