diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 2bc33e4ad673c..5e2645740b26e 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -969,10 +969,6 @@ void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS, bool is_method) MYSQLI_RESOURCE *mysqli_resource; MY_MYSQL *mysql; - if (zend_parse_parameters_none() == FAILURE) { - RETURN_THROWS(); - } - if (is_method && (Z_MYSQLI_P(getThis()))->ptr) { return; } @@ -1004,6 +1000,7 @@ void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS, bool is_method) /* {{{ Initialize mysqli and return a resource for use with mysql_real_connect */ PHP_FUNCTION(mysqli_init) { + ZEND_PARSE_PARAMETERS_NONE(); php_mysqli_init(INTERNAL_FUNCTION_PARAM_PASSTHRU, false); } /* }}} */ diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index 365c4891a09a7..2ae6a2c3b3129 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -72,7 +72,14 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, bool is_real_connect, b } #endif - if (getThis() && !ZEND_NUM_ARGS() && in_ctor) { + if (in_ctor && !ZEND_NUM_ARGS()) { + ZEND_PARSE_PARAMETERS_NONE(); + + if (UNEXPECTED(Z_MYSQLI_P(object)->ptr)) { + zend_throw_error(NULL, "Cannot call constructor twice"); + return; + } + php_mysqli_init(INTERNAL_FUNCTION_PARAM_PASSTHRU, in_ctor); return; } @@ -84,6 +91,11 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, bool is_real_connect, b RETURN_THROWS(); } + if (UNEXPECTED(in_ctor && Z_MYSQLI_P(object)->ptr)) { + zend_throw_error(NULL, "Cannot call constructor twice"); + return; + } + if (object) { ZEND_ASSERT(instanceof_function(Z_OBJCE_P(object), mysqli_link_class_entry)); mysqli_resource = (Z_MYSQLI_P(object))->ptr; @@ -325,6 +337,7 @@ PHP_METHOD(mysqli, __construct) /* {{{ Initialize mysqli and return a resource for use with mysql_real_connect */ PHP_METHOD(mysqli, init) { + ZEND_PARSE_PARAMETERS_NONE(); php_mysqli_init(INTERNAL_FUNCTION_PARAM_PASSTHRU, true); } /* }}} */ diff --git a/ext/mysqli/tests/gh17900.phpt b/ext/mysqli/tests/gh17900.phpt new file mode 100644 index 0000000000000..ed099fa7e8529 --- /dev/null +++ b/ext/mysqli/tests/gh17900.phpt @@ -0,0 +1,16 @@ +--TEST-- +GH-17900 (Assertion failure ext/mysqli/mysqli_prop.c) +--EXTENSIONS-- +mysqli +--FILE-- +__construct('doesnotexist'); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +?> +--EXPECT-- +Cannot call constructor twice diff --git a/ext/mysqli/tests/mysqli_incomplete_initialization.phpt b/ext/mysqli/tests/mysqli_incomplete_initialization.phpt index 51a4d44c72b2f..a5450bd105f44 100644 --- a/ext/mysqli/tests/mysqli_incomplete_initialization.phpt +++ b/ext/mysqli/tests/mysqli_incomplete_initialization.phpt @@ -12,8 +12,8 @@ $mysqli->close(); ?> --EXPECTF-- -Fatal error: Uncaught Error: mysqli object is not fully initialized in %s:%d +Fatal error: Uncaught Error: Cannot call constructor twice in %s:%d Stack trace: -#0 %s(%d): mysqli->close() +#0 %s(%d): mysqli->__construct('doesnotexist') #1 {main} thrown in %s on line %d