From e4ae336c895c99fe41a196ed8e5b929a986506f7 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Tue, 4 Feb 2025 14:14:23 +0000 Subject: [PATCH] ext/pdo: Pass argument number to pdo_dbh_attribute_set() --- ext/pdo/pdo_dbh.c | 28 +++++++++---------- ext/pdo/tests/bug_44159.phpt | 6 ++-- .../tests/pdo_mysql_attr_errmode.phpt | 2 +- .../tests/pdo_mysql_attr_statement_class.phpt | 10 +++---- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 107376ce48b08..677e76f6caf74 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -35,7 +35,7 @@ #include "zend_observer.h" #include "zend_extensions.h" -static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value); +static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value, uint32_t value_arg_num); void pdo_throw_exception(unsigned int driver_errcode, char *driver_errmsg, pdo_error_type *pdo_error) { @@ -512,7 +512,7 @@ PDO_API void php_pdo_internal_construct_driver(INTERNAL_FUNCTION_PARAMETERS, zen ZVAL_DEREF(attr_value); /* TODO: Should the constructor fail when the attribute cannot be set? */ - pdo_dbh_attribute_set(dbh, long_key, attr_value); + pdo_dbh_attribute_set(dbh, long_key, attr_value, 3); } ZEND_HASH_FOREACH_END(); } @@ -814,7 +814,7 @@ PDO_API bool pdo_get_bool_param(bool *bval, const zval *value) } /* Return false on failure, true otherwise */ -static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) /* {{{ */ +static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value, uint32_t value_arg_num) /* {{{ */ { zend_long lval; bool bval; @@ -831,7 +831,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) / dbh->error_mode = lval; return true; default: - zend_value_error("Error mode must be one of the PDO::ERRMODE_* constants"); + zend_argument_value_error(value_arg_num, "Error mode must be one of the PDO::ERRMODE_* constants"); return false; } return false; @@ -847,7 +847,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) / dbh->desired_case = lval; return true; default: - zend_value_error("Case folding mode must be one of the PDO::CASE_* constants"); + zend_argument_value_error(value_arg_num, "Case folding mode must be one of the PDO::CASE_* constants"); return false; } return false; @@ -865,7 +865,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) / zval *tmp; if ((tmp = zend_hash_index_find(Z_ARRVAL_P(value), 0)) != NULL && Z_TYPE_P(tmp) == IS_LONG) { if (Z_LVAL_P(tmp) == PDO_FETCH_INTO || Z_LVAL_P(tmp) == PDO_FETCH_CLASS) { - zend_value_error("PDO::FETCH_INTO and PDO::FETCH_CLASS cannot be set as the default fetch mode"); + zend_argument_value_error(value_arg_num, "PDO::FETCH_INTO and PDO::FETCH_CLASS cannot be set as the default fetch mode"); return false; } } @@ -876,7 +876,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) / } } if (lval == PDO_FETCH_USE_DEFAULT) { - zend_value_error("Fetch mode must be a bitmask of PDO::FETCH_* constants"); + zend_argument_value_error(value_arg_num, "Fetch mode must be a bitmask of PDO::FETCH_* constants"); return false; } dbh->default_fetch_type = lval; @@ -906,25 +906,25 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) / return false; } if (Z_TYPE_P(value) != IS_ARRAY) { - zend_type_error("PDO::ATTR_STATEMENT_CLASS value must be of type array, %s given", + zend_argument_type_error(value_arg_num, "PDO::ATTR_STATEMENT_CLASS value must be of type array, %s given", zend_zval_value_name(value)); return false; } if ((item = zend_hash_index_find(Z_ARRVAL_P(value), 0)) == NULL) { - zend_value_error("PDO::ATTR_STATEMENT_CLASS value must be an array with the format " + zend_argument_value_error(value_arg_num, "PDO::ATTR_STATEMENT_CLASS value must be an array with the format " "array(classname, constructor_args)"); return false; } if (Z_TYPE_P(item) != IS_STRING || (pce = zend_lookup_class(Z_STR_P(item))) == NULL) { - zend_type_error("PDO::ATTR_STATEMENT_CLASS class must be a valid class"); + zend_argument_type_error(value_arg_num, "PDO::ATTR_STATEMENT_CLASS class must be a valid class"); return false; } if (!instanceof_function(pce, pdo_dbstmt_ce)) { - zend_type_error("PDO::ATTR_STATEMENT_CLASS class must be derived from PDOStatement"); + zend_argument_type_error(value_arg_num, "PDO::ATTR_STATEMENT_CLASS class must be derived from PDOStatement"); return false; } if (pce->constructor && !(pce->constructor->common.fn_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED))) { - zend_type_error("User-supplied statement class cannot have a public constructor"); + zend_argument_type_error(value_arg_num, "User-supplied statement class cannot have a public constructor"); return false; } dbh->def_stmt_ce = pce; @@ -934,7 +934,7 @@ static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value) / } if ((item = zend_hash_index_find(Z_ARRVAL_P(value), 1)) != NULL) { if (Z_TYPE_P(item) != IS_ARRAY) { - zend_type_error("PDO::ATTR_STATEMENT_CLASS constructor_args must be of type ?array, %s given", + zend_argument_type_error(value_arg_num, "PDO::ATTR_STATEMENT_CLASS constructor_args must be of type ?array, %s given", zend_zval_value_name(value)); return false; } @@ -980,7 +980,7 @@ PHP_METHOD(PDO, setAttribute) PDO_DBH_CLEAR_ERR(); PDO_CONSTRUCT_CHECK; - RETURN_BOOL(pdo_dbh_attribute_set(dbh, attr, value)); + RETURN_BOOL(pdo_dbh_attribute_set(dbh, attr, value, 2)); } /* }}} */ diff --git a/ext/pdo/tests/bug_44159.phpt b/ext/pdo/tests/bug_44159.phpt index 9d6b2876a15ef..1784324875edc 100644 --- a/ext/pdo/tests/bug_44159.phpt +++ b/ext/pdo/tests/bug_44159.phpt @@ -40,9 +40,9 @@ foreach ($attrs as $attr) { ?> --EXPECT-- -TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, null given -TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, int given -TypeError: PDO::ATTR_STATEMENT_CLASS value must be of type array, string given +TypeError: PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS value must be of type array, null given +TypeError: PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS value must be of type array, int given +TypeError: PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS value must be of type array, string given TypeError: Attribute value must be of type bool for selected attribute, null given bool(true) TypeError: Attribute value must be of type bool for selected attribute, string given diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_errmode.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_errmode.phpt index df5f6c99d3483..95fcb16824c0f 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_errmode.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_errmode.phpt @@ -158,7 +158,7 @@ error_reporting=E_ALL TypeError: Attribute value must be of type int for selected attribute, array given TypeError: Attribute value must be of type int for selected attribute, stdClass given TypeError: Attribute value must be of type int for selected attribute, string given -ValueError: Error mode must be one of the PDO::ERRMODE_* constants +ValueError: PDO::setAttribute(): Argument #2 ($value) Error mode must be one of the PDO::ERRMODE_* constants Warning: PDO::query(): SQLSTATE[42000]: Syntax error or access violation: %d You have an error in your SQL syntax; check the manual that corresponds to your %s server version for the right syntax to use near '%s' at line %d in %s on line %d diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt index a22af1cbdefb1..c932d14288d15 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_statement_class.phpt @@ -136,11 +136,11 @@ array(1) { [0]=> string(12) "PDOStatement" } -PDO::ATTR_STATEMENT_CLASS value must be of type array, string given -PDO::ATTR_STATEMENT_CLASS class must be a valid class -PDO::ATTR_STATEMENT_CLASS class must be a valid class -PDO::ATTR_STATEMENT_CLASS class must be derived from PDOStatement -TypeError: User-supplied statement class cannot have a public constructor +PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS value must be of type array, string given +PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS class must be a valid class +PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS class must be a valid class +PDO::setAttribute(): Argument #2 ($value) PDO::ATTR_STATEMENT_CLASS class must be derived from PDOStatement +TypeError: PDO::setAttribute(): Argument #2 ($value) User-supplied statement class cannot have a public constructor array(2) { [0]=> string(12) "mystatement4"