From 70cb8f96af7226cf35158d70315e7d7de93a95ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Fri, 24 Jan 2020 20:08:32 +0100 Subject: [PATCH 1/2] Fix #78666 mysqli_options generates Warning on var_dump() --- ext/mysqli/mysqli.c | 20 ++- ext/mysqli/mysqli_driver.c | 32 +++-- ext/mysqli/mysqli_prop.c | 121 ++++++++++-------- ext/mysqli/mysqli_warning.c | 25 ++-- ext/mysqli/php_mysqli_structs.h | 2 +- ext/mysqli/tests/bug28817.phpt | 4 +- ext/mysqli/tests/bug34810.phpt | 29 +---- ext/mysqli/tests/mysqli_real_connect.phpt | 32 +---- .../tests/mysqli_result_references.phpt | 12 +- 9 files changed, 121 insertions(+), 156 deletions(-) diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 612239527e3c..020f056d666b 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -69,7 +69,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 { @@ -281,10 +281,11 @@ 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; + + return FAILURE; } /* }}} */ @@ -292,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; } /* }}} */ @@ -320,9 +322,14 @@ zval *mysqli_read_property(zval *object, zval *member, int type, void **cache_sl } if (hnd) { - retval = hnd->read_func(obj, rv); - if (retval == NULL) { - retval = &EG(uninitialized_zval); + if (hnd->read_func(obj, rv, type == BP_VAR_IS) == SUCCESS && rv != NULL) { + retval = rv; + } else { + if (type == BP_VAR_IS || rv == NULL) { + retval = &EG(uninitialized_zval); + } else { + retval = rv; + } } } else { retval = zend_std_read_property(object, member, type, cache_slot, rv); @@ -435,6 +442,7 @@ HashTable *mysqli_object_get_debug_info(zval *object, int *is_temp) zval rv, member; zval *value; ZVAL_STR(&member, entry->name); + value = mysqli_read_property(object, &member, BP_VAR_IS, 0, &rv); if (value != &EG(uninitialized_zval)) { zend_hash_add(retval, Z_STR(member), value); diff --git a/ext/mysqli/mysqli_driver.c b/ext/mysqli/mysqli_driver.c index 7df2eca11b0c..227530abdeb8 100644 --- a/ext/mysqli/mysqli_driver.c +++ b/ext/mysqli/mysqli_driver.c @@ -30,10 +30,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) \ @@ -44,10 +44,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) \ @@ -58,10 +58,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 SUCESS; \ } \ #define MAP_PROPERTY_MYG_STRING_WRITE(name, value) \ @@ -82,34 +82,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; } /* }}} */ diff --git a/ext/mysqli/mysqli_prop.c b/ext/mysqli/mysqli_prop.c index eab1a0676c9a..8190d4ab0e46 100644 --- a/ext/mysqli/mysqli_prop.c +++ b/ext/mysqli/mysqli_prop.c @@ -29,49 +29,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;\ @@ -84,12 +91,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;\ @@ -103,66 +110,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) { @@ -171,16 +182,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; @@ -216,7 +228,7 @@ static zval *link_error_list_read(mysqli_object *obj, zval *retval) ZVAL_EMPTY_ARRAY(retval); } - return retval; + return SUCCESS; } /* }}} */ @@ -237,11 +249,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) { @@ -249,12 +261,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) @@ -264,7 +277,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))) { @@ -278,7 +291,8 @@ static zval *result_lengths_read(mysqli_object *obj, zval *retval) add_index_long(retval, i, ret[i]); } } - return retval; + + return SUCCESS; } /* }}} */ @@ -289,11 +303,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; @@ -302,17 +316,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; @@ -323,7 +338,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) { @@ -332,16 +347,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) { @@ -375,7 +391,8 @@ static zval *stmt_error_list_read(mysqli_object *obj, zval *retval) } else { ZVAL_EMPTY_ARRAY(retval); } - return retval; + + return SUCCESS; } /* }}} */ diff --git a/ext/mysqli/mysqli_warning.c b/ext/mysqli/mysqli_warning.c index 248d9a281f2a..90b6e8b44c10 100644 --- a/ext/mysqli/mysqli_warning.c +++ b/ext/mysqli/mysqli_warning.c @@ -199,49 +199,50 @@ 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; + 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; + 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; + return FAILURE; } + w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr; ZVAL_LONG(retval, w->errorno); - return retval; + + return SUCCESS; } /* }}} */ diff --git a/ext/mysqli/php_mysqli_structs.h b/ext/mysqli/php_mysqli_structs.h index 93fbc15e91b0..96fbacb82e73 100644 --- a/ext/mysqli/php_mysqli_structs.h +++ b/ext/mysqli/php_mysqli_structs.h @@ -158,7 +158,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; diff --git a/ext/mysqli/tests/bug28817.phpt b/ext/mysqli/tests/bug28817.phpt index 5a5e9244764c..18370485178d 100644 --- a/ext/mysqli/tests/bug28817.phpt +++ b/ext/mysqli/tests/bug28817.phpt @@ -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) diff --git a/ext/mysqli/tests/bug34810.phpt b/ext/mysqli/tests/bug34810.phpt index d9afc246eb66..b56d1a5ac7cf 100644 --- a/ext/mysqli/tests/bug34810.phpt +++ b/ext/mysqli/tests/bug34810.phpt @@ -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 diff --git a/ext/mysqli/tests/mysqli_real_connect.phpt b/ext/mysqli/tests/mysqli_real_connect.phpt index 1316d1a98194..2e39833ffe80 100644 --- a/ext/mysqli/tests/mysqli_real_connect.phpt +++ b/ext/mysqli/tests/mysqli_real_connect.phpt @@ -138,7 +138,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); @@ -179,42 +179,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 diff --git a/ext/mysqli/tests/mysqli_result_references.phpt b/ext/mysqli/tests/mysqli_result_references.phpt index 33e5a1f1dae5..c95e558da068 100644 --- a/ext/mysqli/tests/mysqli_result_references.phpt +++ b/ext/mysqli/tests/mysqli_result_references.phpt @@ -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){ From 0ef6b2b65a87c4f05c8d9ddd4519019b136d5a93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Tue, 28 Jan 2020 15:34:53 +0100 Subject: [PATCH 2/2] Address code review comments --- ext/mysqli/mysqli.c | 12 +++++------- ext/mysqli/mysqli_driver.c | 2 +- ext/mysqli/mysqli_warning.c | 15 +++++++++++++++ ext/mysqli/tests/mysqli_result_references.phpt | 2 +- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 020f056d666b..dc2e0e7e33aa 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -283,7 +283,9 @@ static void mysqli_warning_free_storage(zend_object *object) /* {{{ mysqli_read_na */ static int mysqli_read_na(mysqli_object *obj, zval *retval, zend_bool quiet) { - zend_throw_error(NULL, "Cannot read property"); + if (!quiet) { + zend_throw_error(NULL, "Cannot read property"); + } return FAILURE; } @@ -322,14 +324,10 @@ zval *mysqli_read_property(zval *object, zval *member, int type, void **cache_sl } if (hnd) { - if (hnd->read_func(obj, rv, type == BP_VAR_IS) == SUCCESS && rv != NULL) { + if (hnd->read_func(obj, rv, type == BP_VAR_IS) == SUCCESS || type != BP_VAR_IS) { retval = rv; } else { - if (type == BP_VAR_IS || rv == NULL) { - retval = &EG(uninitialized_zval); - } else { - retval = rv; - } + retval = &EG(uninitialized_zval); } } else { retval = zend_std_read_property(object, member, type, cache_slot, rv); diff --git a/ext/mysqli/mysqli_driver.c b/ext/mysqli/mysqli_driver.c index 227530abdeb8..3e21534dd935 100644 --- a/ext/mysqli/mysqli_driver.c +++ b/ext/mysqli/mysqli_driver.c @@ -61,7 +61,7 @@ static int name(mysqli_object *obj, zval *value) \ static int name(mysqli_object *obj, zval *retval, zend_bool quiet) \ { \ ZVAL_STRING(retval, MyG(value)); \ - return SUCESS; \ + return SUCCESS; \ } \ #define MAP_PROPERTY_MYG_STRING_WRITE(name, value) \ diff --git a/ext/mysqli/mysqli_warning.c b/ext/mysqli/mysqli_warning.c index 90b6e8b44c10..ab6a0d3830d7 100644 --- a/ext/mysqli/mysqli_warning.c +++ b/ext/mysqli/mysqli_warning.c @@ -204,6 +204,11 @@ static int mysqli_warning_message(mysqli_object *obj, zval *retval, zend_bool qu MYSQLI_WARNING *w; if (!obj->ptr || !((MYSQLI_RESOURCE *)(obj->ptr))->ptr) { + if (!quiet) { + php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name)); + } + ZVAL_NULL(retval); + return FAILURE; } @@ -220,6 +225,11 @@ static int mysqli_warning_sqlstate(mysqli_object *obj, zval *retval, zend_bool q MYSQLI_WARNING *w; if (!obj->ptr || !((MYSQLI_RESOURCE *)(obj->ptr))->ptr) { + if (!quiet) { + php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name)); + } + ZVAL_NULL(retval); + return FAILURE; } @@ -236,6 +246,11 @@ static int mysqli_warning_errno(mysqli_object *obj, zval *retval, zend_bool quie MYSQLI_WARNING *w; if (!obj->ptr || !((MYSQLI_RESOURCE *)(obj->ptr))->ptr) { + if (!quiet) { + php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name)); + } + ZVAL_NULL(retval); + return FAILURE; } diff --git a/ext/mysqli/tests/mysqli_result_references.phpt b/ext/mysqli/tests/mysqli_result_references.phpt index c95e558da068..d4fe48816a51 100644 --- a/ext/mysqli/tests/mysqli_result_references.phpt +++ b/ext/mysqli/tests/mysqli_result_references.phpt @@ -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)))