summaryrefslogtreecommitdiff
path: root/ext/mysqli/mysqli_nonapi.c
diff options
context:
space:
mode:
authorGeorge Peter Banyard <girgias@php.net>2020-07-03 13:43:29 +0200
committerGeorge Peter Banyard <girgias@php.net>2020-09-15 19:12:02 +0200
commit7a95e943d642e05532979a06221c476183eac7e4 (patch)
treeded828cad622e5e55e06ec70c9e044e834fffc94 /ext/mysqli/mysqli_nonapi.c
parent7e61c2edd8456ff502e17e14d517da409f1e6193 (diff)
downloadphp-git-7a95e943d642e05532979a06221c476183eac7e4.tar.gz
Promote warnings to Error in MySQLi extension
Closes GH-5803
Diffstat (limited to 'ext/mysqli/mysqli_nonapi.c')
-rw-r--r--ext/mysqli/mysqli_nonapi.c69
1 files changed, 37 insertions, 32 deletions
diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c
index 9b675bb526..394afc7ccc 100644
--- a/ext/mysqli/mysqli_nonapi.c
+++ b/ext/mysqli/mysqli_nonapi.c
@@ -28,6 +28,7 @@
#include "zend_smart_str.h"
#include "php_mysqli_structs.h"
#include "mysqli_priv.h"
+#define ERROR_ARG_POS(arg_num) (getThis() ? (arg_num-1) : (arg_num))
#define SAFE_STR(a) ((a)?a:"")
@@ -435,9 +436,9 @@ PHP_FUNCTION(mysqli_fetch_all)
MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
if (!mode || (mode & ~MYSQLND_FETCH_BOTH)) {
- php_error_docref(NULL, E_WARNING, "Mode can be only MYSQLI_FETCH_NUM, "
- "MYSQLI_FETCH_ASSOC or MYSQLI_FETCH_BOTH");
- RETURN_FALSE;
+ zend_argument_value_error(ERROR_ARG_POS(2), "must be one of MYSQLI_FETCH_NUM, "
+ "MYSQLI_FETCH_ASSOC, or MYSQLI_FETCH_BOTH");
+ RETURN_THROWS();
}
mysqlnd_fetch_all(result, mode, return_value);
@@ -631,16 +632,18 @@ PHP_FUNCTION(mysqli_query)
}
if (!query_len) {
- php_error_docref(NULL, E_WARNING, "Empty query");
- RETURN_FALSE;
+ zend_argument_value_error(ERROR_ARG_POS(2), "cannot be empty");
+ RETURN_THROWS();
}
-#ifdef MYSQLI_USE_MYSQLND
- if ((resultmode & ~MYSQLI_ASYNC) != MYSQLI_USE_RESULT && (resultmode & ~(MYSQLI_ASYNC | MYSQLI_STORE_RESULT_COPY_DATA)) != MYSQLI_STORE_RESULT) {
-#else
- if ((resultmode & ~MYSQLI_ASYNC) != MYSQLI_USE_RESULT && (resultmode & ~MYSQLI_ASYNC) != MYSQLI_STORE_RESULT) {
-#endif
- php_error_docref(NULL, E_WARNING, "Invalid value for resultmode");
- RETURN_FALSE;
+ if ((resultmode & ~MYSQLI_ASYNC) != MYSQLI_USE_RESULT &&
+ MYSQLI_STORE_RESULT != (resultmode & ~(MYSQLI_ASYNC | MYSQLI_STORE_RESULT_COPY_DATA))
+ ) {
+ zend_argument_value_error(ERROR_ARG_POS(3), "must be either MYSQLI_USE_RESULT, or MYSQLI_STORE_RESULT"
+ #ifdef MYSQLI_USE_MYSQLND
+ " with MYSQLI_ASYNC as an optional bitmask flag"
+ #endif
+ );
+ RETURN_THROWS();
}
MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID);
@@ -722,7 +725,8 @@ static int mysqlnd_zval_array_to_mysqlnd_array(zval *in_array, MYSQLND ***out_ar
i++;
if (Z_TYPE_P(elem) != IS_OBJECT ||
!instanceof_function(Z_OBJCE_P(elem), mysqli_link_class_entry)) {
- php_error_docref(NULL, E_WARNING, "Parameter %d not a mysqli object", i);
+ zend_argument_type_error(i, "must be an instance of mysqli, %s given", zend_zval_type_name(elem));
+ return FAILURE;
} else {
MY_MYSQL *mysql;
MYSQLI_RESOURCE *my_res;
@@ -831,11 +835,16 @@ PHP_FUNCTION(mysqli_poll)
if (zend_parse_parameters(ZEND_NUM_ARGS(), "a!a!al|l", &r_array, &e_array, &dont_poll_array, &sec, &usec) == FAILURE) {
RETURN_THROWS();
}
- if (sec < 0 || usec < 0) {
- php_error_docref(NULL, E_WARNING, "Negative values passed for sec and/or usec");
- RETURN_FALSE;
+ if (sec < 0) {
+ zend_argument_value_error(4, "must be greater than or equal to 0");
+ RETURN_THROWS();
+ }
+ if (usec < 0) {
+ zend_argument_value_error(5, "must be greater than or equal to 0");
+ RETURN_THROWS();
}
+ // TODO Error promotion
if (!r_array && !e_array) {
php_error_docref(NULL, E_WARNING, "No stream arrays were passed");
RETURN_FALSE;
@@ -1152,22 +1161,18 @@ PHP_FUNCTION(mysqli_begin_transaction)
zend_long flags = TRANS_START_NO_OPT;
char * name = NULL;
size_t name_len = -1;
- zend_bool err = FALSE;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|ls!", &mysql_link, mysqli_link_class_entry, &flags, &name, &name_len) == FAILURE) {
RETURN_THROWS();
}
MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID);
if (flags < 0) {
- php_error_docref(NULL, E_WARNING, "Invalid value for parameter flags (" ZEND_LONG_FMT ")", flags);
- err = TRUE;
+ zend_argument_value_error(ERROR_ARG_POS(2), "must be one of the MYSQLI_TRANS_* constants");
+ RETURN_THROWS();
}
if (!name_len) {
- php_error_docref(NULL, E_WARNING, "Savepoint name cannot be empty");
- err = TRUE;
- }
- if (TRUE == err) {
- RETURN_FALSE;
+ zend_argument_value_error(ERROR_ARG_POS(3), "cannot be empty");
+ RETURN_THROWS();
}
#ifndef MYSQLI_USE_MYSQLND
@@ -1203,15 +1208,15 @@ PHP_FUNCTION(mysqli_savepoint)
MY_MYSQL *mysql;
zval *mysql_link;
char * name = NULL;
- size_t name_len = -1;
+ size_t name_len;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &mysql_link, mysqli_link_class_entry, &name, &name_len) == FAILURE) {
RETURN_THROWS();
}
MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID);
- if (!name || !name_len) {
- php_error_docref(NULL, E_WARNING, "Savepoint name cannot be empty");
- RETURN_FALSE;
+ if (name_len == 0) {
+ zend_argument_value_error(ERROR_ARG_POS(2), "cannot be empty");
+ RETURN_THROWS();
}
#ifndef MYSQLI_USE_MYSQLND
@@ -1231,15 +1236,15 @@ PHP_FUNCTION(mysqli_release_savepoint)
MY_MYSQL *mysql;
zval *mysql_link;
char * name = NULL;
- size_t name_len = -1;
+ size_t name_len;
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &mysql_link, mysqli_link_class_entry, &name, &name_len) == FAILURE) {
RETURN_THROWS();
}
MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID);
- if (!name || !name_len) {
- php_error_docref(NULL, E_WARNING, "Savepoint name cannot be empty");
- RETURN_FALSE;
+ if (name_len == 0) {
+ zend_argument_value_error(ERROR_ARG_POS(2), "cannot be empty");
+ RETURN_THROWS();
}
#ifndef MYSQLI_USE_MYSQLND
if (mysqli_savepoint_libmysql(mysql->mysql, name, TRUE)) {