Merge branch 'PHP-7.4'

* Fix #78666 mysqli_options generates Warning on var_dump()
This commit is contained in:
Máté Kocsis 2020-01-28 18:51:00 +01:00
commit cffff1fb03
No known key found for this signature in database
GPG key ID: FD055E41728BF310
9 changed files with 134 additions and 157 deletions

View file

@ -67,7 +67,7 @@ zend_class_entry *mysqli_warning_class_entry;
zend_class_entry *mysqli_exception_class_entry;
typedef zval *(*mysqli_read_t)(mysqli_object *obj, zval *rv);
typedef int (*mysqli_read_t)(mysqli_object *obj, zval *rv, zend_bool quiet);
typedef int (*mysqli_write_t)(mysqli_object *obj, zval *newval);
typedef struct _mysqli_prop_handler {
@ -279,10 +279,13 @@ static void mysqli_warning_free_storage(zend_object *object)
/* }}} */
/* {{{ mysqli_read_na */
static zval *mysqli_read_na(mysqli_object *obj, zval *retval)
static int mysqli_read_na(mysqli_object *obj, zval *retval, zend_bool quiet)
{
zend_throw_error(NULL, "Cannot read property");
return NULL;
if (!quiet) {
zend_throw_error(NULL, "Cannot read property");
}
return FAILURE;
}
/* }}} */
@ -290,6 +293,7 @@ static zval *mysqli_read_na(mysqli_object *obj, zval *retval)
static int mysqli_write_na(mysqli_object *obj, zval *newval)
{
zend_throw_error(NULL, "Cannot write property");
return FAILURE;
}
/* }}} */
@ -308,8 +312,9 @@ zval *mysqli_read_property(zend_object *object, zend_string *name, int type, voi
}
if (hnd) {
retval = hnd->read_func(obj, rv);
if (retval == NULL) {
if (hnd->read_func(obj, rv, type == BP_VAR_IS) == SUCCESS || type != BP_VAR_IS) {
retval = rv;
} else {
retval = &EG(uninitialized_zval);
}
} else {

View file

@ -28,10 +28,10 @@
#include "mysqli_fe.h"
#define MAP_PROPERTY_MYG_BOOL_READ(name, value) \
static zval *name(mysqli_object *obj, zval *retval) \
static int name(mysqli_object *obj, zval *retval, zend_bool quiet) \
{ \
ZVAL_BOOL(retval, MyG(value)); \
return retval; \
return SUCCESS; \
} \
#define MAP_PROPERTY_MYG_BOOL_WRITE(name, value) \
@ -42,10 +42,10 @@ static int name(mysqli_object *obj, zval *value) \
} \
#define MAP_PROPERTY_MYG_LONG_READ(name, value) \
static zval *name(mysqli_object *obj, zval *retval) \
static int name(mysqli_object *obj, zval *retval, zend_bool quiet) \
{ \
ZVAL_LONG(retval, MyG(value)); \
return retval; \
return SUCCESS; \
} \
#define MAP_PROPERTY_MYG_LONG_WRITE(name, value) \
@ -56,10 +56,10 @@ static int name(mysqli_object *obj, zval *value) \
} \
#define MAP_PROPERTY_MYG_STRING_READ(name, value) \
static zval *name(mysqli_object *obj, zval *retval) \
static int name(mysqli_object *obj, zval *retval, zend_bool quiet) \
{ \
ZVAL_STRING(retval, MyG(value)); \
return retval; \
return SUCCESS; \
} \
#define MAP_PROPERTY_MYG_STRING_WRITE(name, value) \
@ -80,34 +80,38 @@ static int driver_report_write(mysqli_object *obj, zval *value)
/* }}} */
/* {{{ property driver_embedded_read */
static zval *driver_embedded_read(mysqli_object *obj, zval *retval)
static int driver_embedded_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
ZVAL_FALSE(retval);
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property driver_client_version_read */
static zval *driver_client_version_read(mysqli_object *obj, zval *retval)
static int driver_client_version_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
ZVAL_LONG(retval, MYSQL_VERSION_ID);
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property driver_client_info_read */
static zval *driver_client_info_read(mysqli_object *obj, zval *retval)
static int driver_client_info_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
ZVAL_STRING(retval, (char *)mysql_get_client_info());
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property driver_driver_version_read */
static zval *driver_driver_version_read(mysqli_object *obj, zval *retval)
static int driver_driver_version_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
ZVAL_LONG(retval, MYSQLI_VERSION_ID);
return retval;
return SUCCESS;
}
/* }}} */

View file

@ -27,49 +27,56 @@
#include "php_mysqli_structs.h"
#include "mysqli_priv.h"
#define CHECK_STATUS(value) \
#define CHECK_STATUS(value, quiet) \
if (!obj->ptr || ((MYSQLI_RESOURCE *)obj->ptr)->status < value ) { \
php_error_docref(NULL, E_WARNING, "Property access is not allowed yet"); \
if (!quiet) { \
php_error_docref(NULL, E_WARNING, "Property access is not allowed yet"); \
} \
ZVAL_FALSE(retval); \
return retval; \
return FAILURE; \
} \
#define MYSQLI_GET_MYSQL(statusval) \
MYSQL *p; \
if (!obj->ptr || !(MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr) { \
php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name));\
if (!quiet) { \
php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name)); \
} \
ZVAL_FALSE(retval);\
return retval; \
return FAILURE; \
} else { \
CHECK_STATUS(statusval);\
CHECK_STATUS(statusval, quiet);\
p = (MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->mysql;\
}
#define MYSQLI_GET_RESULT(statusval) \
MYSQL_RES *p; \
if (!obj->ptr) { \
php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name));\
if (!quiet) { \
php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name)); \
} \
ZVAL_NULL(retval);\
return retval; \
return FAILURE; \
} else { \
CHECK_STATUS(statusval);\
CHECK_STATUS(statusval, quiet);\
p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr; \
}
#define MYSQLI_GET_STMT(statusval) \
MYSQL_STMT *p; \
if (!obj->ptr) { \
php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name));\
if (!quiet) { \
php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name)); \
} \
ZVAL_NULL(retval);\
return retval; \
return FAILURE; \
} else { \
CHECK_STATUS(statusval);\
p = (MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt;\
CHECK_STATUS(statusval, quiet); \
p = (MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt; \
}
#define MYSQLI_MAP_PROPERTY_FUNC_LONG( __func, __int_func, __get_type, __ret_type, __ret_type_sprint_mod)\
static zval *__func(mysqli_object *obj, zval *retval) \
static int __func(mysqli_object *obj, zval *retval, zend_bool quiet) \
{\
__ret_type l;\
__get_type;\
@ -82,12 +89,12 @@ static zval *__func(mysqli_object *obj, zval *retval) \
} else { \
ZVAL_NEW_STR(retval, strpprintf(0, __ret_type_sprint_mod, l)); \
} \
}\
return retval;\
} \
return SUCCESS; \
}
#define MYSQLI_MAP_PROPERTY_FUNC_STRING(__func, __int_func, __get_type)\
static zval *__func(mysqli_object *obj, zval *retval)\
static int __func(mysqli_object *obj, zval *retval, zend_bool quiet)\
{\
char *c;\
__get_type;\
@ -101,66 +108,70 @@ static zval *__func(mysqli_object *obj, zval *retval)\
ZVAL_STRING(retval, c);\
}\
}\
return retval; \
return SUCCESS; \
}
/* {{{ property link_client_version_read */
static zval *link_client_version_read(mysqli_object *obj, zval *retval)
static int link_client_version_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
ZVAL_LONG(retval, MYSQL_VERSION_ID);
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property link_client_info_read */
static zval *link_client_info_read(mysqli_object *obj, zval *retval)
static int link_client_info_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
CHECK_STATUS(MYSQLI_STATUS_INITIALIZED, quiet);
ZVAL_STRING(retval, MYSQL_SERVER_VERSION);
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property link_connect_errno_read */
static zval *link_connect_errno_read(mysqli_object *obj, zval *retval)
static int link_connect_errno_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
ZVAL_LONG(retval, (zend_long)MyG(error_no));
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property link_connect_error_read */
static zval *link_connect_error_read(mysqli_object *obj, zval *retval)
static int link_connect_error_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
if (MyG(error_msg)) {
ZVAL_STRING(retval, MyG(error_msg));
} else {
ZVAL_NULL(retval);
}
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property link_affected_rows_read */
static zval *link_affected_rows_read(mysqli_object *obj, zval *retval)
static int link_affected_rows_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
MY_MYSQL *mysql;
my_ulonglong rc;
CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
CHECK_STATUS(MYSQLI_STATUS_INITIALIZED, quiet);
mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
if (!mysql) {
ZVAL_NULL(retval);
} else {
CHECK_STATUS(MYSQLI_STATUS_VALID);
CHECK_STATUS(MYSQLI_STATUS_VALID, quiet);
rc = mysql_affected_rows(mysql->mysql);
if (rc == (my_ulonglong) -1) {
ZVAL_LONG(retval, -1);
return retval;
return SUCCESS;
}
if (rc < ZEND_LONG_MAX) {
@ -169,16 +180,17 @@ static zval *link_affected_rows_read(mysqli_object *obj, zval *retval)
ZVAL_NEW_STR(retval, strpprintf(0, MYSQLI_LLU_SPEC, rc));
}
}
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property link_error_list_read */
static zval *link_error_list_read(mysqli_object *obj, zval *retval)
static int link_error_list_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
MY_MYSQL *mysql;
CHECK_STATUS(MYSQLI_STATUS_VALID);
CHECK_STATUS(MYSQLI_STATUS_VALID, quiet);
mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
@ -214,7 +226,7 @@ static zval *link_error_list_read(mysqli_object *obj, zval *retval)
ZVAL_EMPTY_ARRAY(retval);
}
return retval;
return SUCCESS;
}
/* }}} */
@ -235,11 +247,11 @@ MYSQLI_MAP_PROPERTY_FUNC_LONG(link_warning_count_read, mysql_warning_count, MYSQ
/* result properties */
/* {{{ property result_type_read */
static zval *result_type_read(mysqli_object *obj, zval *retval)
static int result_type_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
MYSQL_RES *p;
CHECK_STATUS(MYSQLI_STATUS_VALID);
CHECK_STATUS(MYSQLI_STATUS_VALID, quiet);
p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
if (!p) {
@ -247,12 +259,13 @@ static zval *result_type_read(mysqli_object *obj, zval *retval)
} else {
ZVAL_LONG(retval, mysqli_result_is_unbuffered(p) ? MYSQLI_USE_RESULT:MYSQLI_STORE_RESULT);
}
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property result_lengths_read */
static zval *result_lengths_read(mysqli_object *obj, zval *retval)
static int result_lengths_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
MYSQL_RES *p;
#if defined(MYSQLI_USE_MYSQLND)
@ -262,7 +275,7 @@ static zval *result_lengths_read(mysqli_object *obj, zval *retval)
#endif
uint32_t field_count;
CHECK_STATUS(MYSQLI_STATUS_VALID);
CHECK_STATUS(MYSQLI_STATUS_VALID, quiet);
p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
field_count = mysql_num_fields(p);
if (!p || !field_count || !(ret = mysql_fetch_lengths(p))) {
@ -276,7 +289,8 @@ static zval *result_lengths_read(mysqli_object *obj, zval *retval)
add_index_long(retval, i, ret[i]);
}
}
return retval;
return SUCCESS;
}
/* }}} */
@ -287,11 +301,11 @@ MYSQLI_MAP_PROPERTY_FUNC_LONG(result_num_rows_read, mysql_num_rows, MYSQLI_GET_R
/* statement properties */
/* {{{ property stmt_id_read */
static zval *stmt_id_read(mysqli_object *obj, zval *retval)
static int stmt_id_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
MY_STMT *p;
CHECK_STATUS(MYSQLI_STATUS_VALID);
CHECK_STATUS(MYSQLI_STATUS_VALID, quiet);
p = (MY_STMT*)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
@ -300,17 +314,18 @@ static zval *stmt_id_read(mysqli_object *obj, zval *retval)
} else {
ZVAL_LONG(retval, mysqli_stmt_get_id(p->stmt));
}
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property stmt_affected_rows_read */
static zval *stmt_affected_rows_read(mysqli_object *obj, zval *retval)
static int stmt_affected_rows_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
MY_STMT *p;
my_ulonglong rc;
CHECK_STATUS(MYSQLI_STATUS_VALID);
CHECK_STATUS(MYSQLI_STATUS_VALID, quiet);
p = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
@ -321,7 +336,7 @@ static zval *stmt_affected_rows_read(mysqli_object *obj, zval *retval)
if (rc == (my_ulonglong) -1) {
ZVAL_LONG(retval, -1);
return retval;
return SUCCESS;
}
if (rc < ZEND_LONG_MAX) {
@ -330,16 +345,17 @@ static zval *stmt_affected_rows_read(mysqli_object *obj, zval *retval)
ZVAL_NEW_STR(retval, strpprintf(0, MYSQLI_LLU_SPEC, rc));
}
}
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property stmt_error_list_read */
static zval *stmt_error_list_read(mysqli_object *obj, zval *retval)
static int stmt_error_list_read(mysqli_object *obj, zval *retval, zend_bool quiet)
{
MY_STMT * stmt;
CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
CHECK_STATUS(MYSQLI_STATUS_INITIALIZED, quiet);
stmt = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
if (stmt && stmt->stmt) {
@ -373,7 +389,8 @@ static zval *stmt_error_list_read(mysqli_object *obj, zval *retval)
} else {
ZVAL_EMPTY_ARRAY(retval);
}
return retval;
return SUCCESS;
}
/* }}} */

View file

@ -197,49 +197,65 @@ PHP_METHOD(mysqli_warning, next)
/* }}} */
/* {{{ property mysqli_warning_message */
static
zval *mysqli_warning_message(mysqli_object *obj, zval *retval)
static int mysqli_warning_message(mysqli_object *obj, zval *retval, zend_bool quiet)
{
MYSQLI_WARNING *w;
if (!obj->ptr || !((MYSQLI_RESOURCE *)(obj->ptr))->ptr) {
return NULL;
if (!quiet) {
php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name));
}
ZVAL_NULL(retval);
return FAILURE;
}
w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
ZVAL_COPY(retval, &w->reason);
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property mysqli_warning_sqlstate */
static
zval *mysqli_warning_sqlstate(mysqli_object *obj, zval *retval)
static int mysqli_warning_sqlstate(mysqli_object *obj, zval *retval, zend_bool quiet)
{
MYSQLI_WARNING *w;
if (!obj->ptr || !((MYSQLI_RESOURCE *)(obj->ptr))->ptr) {
return NULL;
if (!quiet) {
php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name));
}
ZVAL_NULL(retval);
return FAILURE;
}
w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
ZVAL_COPY(retval, &w->sqlstate);
return retval;
return SUCCESS;
}
/* }}} */
/* {{{ property mysqli_warning_error */
static
zval *mysqli_warning_errno(mysqli_object *obj, zval *retval)
static int mysqli_warning_errno(mysqli_object *obj, zval *retval, zend_bool quiet)
{
MYSQLI_WARNING *w;
if (!obj->ptr || !((MYSQLI_RESOURCE *)(obj->ptr))->ptr) {
return NULL;
if (!quiet) {
php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name));
}
ZVAL_NULL(retval);
return FAILURE;
}
w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
ZVAL_LONG(retval, w->errorno);
return retval;
return SUCCESS;
}
/* }}} */

View file

@ -155,7 +155,7 @@ struct st_mysqli_warning {
typedef struct _mysqli_property_entry {
const char *pname;
size_t pname_length;
zval *(*r_func)(mysqli_object *obj, zval *retval);
int (*r_func)(mysqli_object *obj, zval *retval, zend_bool quiet);
int (*w_func)(mysqli_object *obj, zval *value);
} mysqli_property_entry;

View file

@ -22,7 +22,7 @@ require_once('skipifconnectfailure.inc');
$mysql = new my_mysql();
var_dump($mysql->p_test);
@var_dump($mysql->errno);
var_dump($mysql->errno);
$mysql->connect($host, $user, $passwd, $db, $port, $socket);
$mysql->select_db("nonexistingdb");
@ -38,5 +38,7 @@ array(2) {
[1]=>
%s(3) "bar"
}
Warning: main(): Couldn't fetch my_mysql in %s on line %d
bool(false)
bool(true)

View file

@ -16,8 +16,7 @@ class DbConnection {
var_dump($link);
$link = mysqli_init();
/* @ is to suppress 'Property access is not allowed yet' */
@var_dump($link);
var_dump($link);
$mysql = new my_mysqli($host, $user, $passwd, $db, $port, $socket);
$mysql->query("DROP TABLE IF EXISTS test_warnings");
@ -36,8 +35,6 @@ class DbConnection {
if ("" == $warning->message)
printf("[004] Message string must not be empty\n");
} else {
printf("[002] Empty error message!\n");
var_dump($warning);
@ -102,8 +99,6 @@ object(mysqli)#%d (%d) {
int(0)
}
object(mysqli)#%d (%d) {
["affected_rows"]=>
bool(false)
["client_info"]=>
string(%d) "%s"
["client_version"]=>
@ -116,27 +111,5 @@ object(mysqli)#%d (%d) {
int(0)
["error"]=>
string(0) ""
["error_list"]=>
bool(false)
["field_count"]=>
bool(false)
["host_info"]=>
bool(false)
["info"]=>
bool(false)
["insert_id"]=>
bool(false)
["server_info"]=>
bool(false)
["server_version"]=>
bool(false)
["sqlstate"]=>
bool(false)
["protocol_version"]=>
bool(false)
["thread_id"]=>
bool(false)
["warning_count"]=>
bool(false)
}
Done

View file

@ -111,7 +111,7 @@ mysqli.allow_local_infile=1
}
mysqli_close($link);
@var_dump($link);
var_dump($link);
if ($IS_MYSQLND) {
ini_set('mysqli.default_host', 'p:' . $host);
@ -152,42 +152,12 @@ mysqli.allow_local_infile=1
--EXPECTF--
Warning: mysqli_real_connect(): (%s/%d): Access denied for user '%s'@'%s' (using password: YES) in %s on line %d
object(mysqli)#%d (%d) {
["affected_rows"]=>
bool(false)
["client_info"]=>
%s
["client_version"]=>
int(%d)
["connect_errno"]=>
int(%d)
["connect_error"]=>
NULL
["errno"]=>
%s
["error"]=>
%s
["error_list"]=>
bool(false)
["field_count"]=>
bool(false)
["host_info"]=>
bool(false)
["info"]=>
bool(false)
["insert_id"]=>
bool(false)
["server_info"]=>
bool(false)
["server_version"]=>
bool(false)
["sqlstate"]=>
bool(false)
["protocol_version"]=>
bool(false)
["thread_id"]=>
bool(false)
["warning_count"]=>
bool(false)
}
Warning: mysqli_real_connect(): Couldn't fetch mysqli in %s on line %d

View file

@ -59,7 +59,7 @@ require_once('skipifconnectfailure.inc');
$references[$idx++] = &$res;
mysqli_free_result($res);
@debug_zval_dump($references);
debug_zval_dump($references);
if (!(mysqli_real_query($link, "SELECT id, label FROM test ORDER BY id ASC LIMIT 1")) ||
!($res = mysqli_use_result($link)))
@ -129,17 +129,7 @@ array(7) refcount(2){
&int(4)
}
[6]=>
&object(mysqli_result)#%d (5) refcount(%d){
["current_field"]=>
NULL
["field_count"]=>
NULL
["lengths"]=>
bool(false)
["num_rows"]=>
NULL
["type"]=>
bool(false)
&object(mysqli_result)#%d (0) refcount(%d){
}
}
array(1) refcount(2){