diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 1db33e5b18225..e955eed0928c8 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -984,12 +984,15 @@ PHP_FUNCTION(pg_query) } link = FETCH_DEFAULT_LINK(); CHECK_DEFAULT_LINK(link); - } else { + } else if (ZEND_NUM_ARGS() == 2) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &pgsql_link, pgsql_link_ce, &query, &query_len) == FAILURE) { RETURN_THROWS(); } link = Z_PGSQL_LINK_P(pgsql_link); CHECK_PGSQL_LINK(link); + } else { + zend_wrong_parameters_count_error(1, 2); + RETURN_THROWS(); } pgsql = link->conn; @@ -1078,12 +1081,15 @@ PHP_FUNCTION(pg_query_params) } link = FETCH_DEFAULT_LINK(); CHECK_DEFAULT_LINK(link); - } else { + } else if (ZEND_NUM_ARGS() == 3) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osa", &pgsql_link, pgsql_link_ce, &query, &query_len, &pv_param_arr) == FAILURE) { RETURN_THROWS(); } link = Z_PGSQL_LINK_P(pgsql_link); CHECK_PGSQL_LINK(link); + } else { + zend_wrong_parameters_count_error(2, 3); + RETURN_THROWS(); } pgsql = link->conn; @@ -1183,12 +1189,15 @@ PHP_FUNCTION(pg_prepare) } link = FETCH_DEFAULT_LINK(); CHECK_DEFAULT_LINK(link); - } else { + } else if (ZEND_NUM_ARGS() == 3) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oss", &pgsql_link, pgsql_link_ce, &stmtname, &stmtname_len, &query, &query_len) == FAILURE) { RETURN_THROWS(); } link = Z_PGSQL_LINK_P(pgsql_link); CHECK_PGSQL_LINK(link); + } else { + zend_wrong_parameters_count_error(2, 3); + RETURN_THROWS(); } pgsql = link->conn; @@ -1264,12 +1273,15 @@ PHP_FUNCTION(pg_execute) } link = FETCH_DEFAULT_LINK(); CHECK_DEFAULT_LINK(link); - } else { + } else if (ZEND_NUM_ARGS() == 3) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osa", &pgsql_link, pgsql_link_ce, &stmtname, &stmtname_len, &pv_param_arr) == FAILURE) { RETURN_THROWS(); } link = Z_PGSQL_LINK_P(pgsql_link); CHECK_PGSQL_LINK(link); + } else { + zend_wrong_parameters_count_error(2, 3); + RETURN_THROWS(); } pgsql = link->conn; @@ -2024,7 +2036,7 @@ static void php_pgsql_data_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type, bo Z_PARAM_OBJECT_OF_CLASS(result, pgsql_result_ce) Z_PARAM_STR_OR_LONG(field_name, field_offset) ZEND_PARSE_PARAMETERS_END(); - } else { + } else if (ZEND_NUM_ARGS() == 3) { ZEND_PARSE_PARAMETERS_START(3, 3) Z_PARAM_OBJECT_OF_CLASS(result, pgsql_result_ce) if (nullable_row) { @@ -2034,6 +2046,9 @@ static void php_pgsql_data_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type, bo } Z_PARAM_STR_OR_LONG(field_name, field_offset) ZEND_PARSE_PARAMETERS_END(); + } else { + zend_wrong_parameters_count_error(2, 3); + RETURN_THROWS(); } pg_result = Z_PGSQL_RESULT_P(result); @@ -2849,12 +2864,15 @@ PHP_FUNCTION(pg_set_error_verbosity) } link = FETCH_DEFAULT_LINK(); CHECK_DEFAULT_LINK(link); - } else { + } else if (ZEND_NUM_ARGS() == 2) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &pgsql_link, pgsql_link_ce, &verbosity) == FAILURE) { RETURN_THROWS(); } link = Z_PGSQL_LINK_P(pgsql_link); CHECK_PGSQL_LINK(link); + } else { + zend_wrong_parameters_count_error(1, 2); + RETURN_THROWS(); } pgsql = link->conn; @@ -2907,12 +2925,15 @@ PHP_FUNCTION(pg_set_client_encoding) } link = FETCH_DEFAULT_LINK(); CHECK_DEFAULT_LINK(link); - } else { + } else if (ZEND_NUM_ARGS() == 2) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &pgsql_link, pgsql_link_ce, &encoding, &encoding_len) == FAILURE) { RETURN_THROWS(); } link = Z_PGSQL_LINK_P(pgsql_link); CHECK_PGSQL_LINK(link); + } else { + zend_wrong_parameters_count_error(1, 2); + RETURN_THROWS(); } pgsql = link->conn; @@ -2996,12 +3017,15 @@ PHP_FUNCTION(pg_put_line) } link = FETCH_DEFAULT_LINK(); CHECK_DEFAULT_LINK(link); - } else { + } else if (ZEND_NUM_ARGS() == 2) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &pgsql_link, pgsql_link_ce, &query, &query_len) == FAILURE) { RETURN_THROWS(); } link = Z_PGSQL_LINK_P(pgsql_link); CHECK_PGSQL_LINK(link); + } else { + zend_wrong_parameters_count_error(1, 2); + RETURN_THROWS(); } pgsql = link->conn; diff --git a/ext/pgsql/tests/gh17165.phpt b/ext/pgsql/tests/gh17165.phpt new file mode 100644 index 0000000000000..2fe3f2ad18add --- /dev/null +++ b/ext/pgsql/tests/gh17165.phpt @@ -0,0 +1,65 @@ +--TEST-- +Fix pg_query()/pg_query_params()/pg_prepare()/pg_execute()/pg_set_error_verbosity()/pg_set_client_encoding()/pg_put_line() pg field infos calls ArgumentCountError message. +--EXTENSIONS-- +pgsql +--SKIPIF-- + +--FILE-- +getMessage(), PHP_EOL; +} + +try { + pg_query_params($db, "b", array(), "d"); +} catch (ArgumentCountError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + pg_prepare($db, "a", "b", "c"); +} catch (ArgumentCountError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + pg_set_error_verbosity($db, 0, PHP_INT_MAX); +} catch (ArgumentCountError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + pg_set_client_encoding($db, "foo", "bar"); +} catch (ArgumentCountError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + pg_put_line($db, "my", "data"); +} catch (ArgumentCountError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + pg_field_is_null($db, false, "myfield", new stdClass()); +} catch (ArgumentCountError $e) { + echo $e->getMessage(), PHP_EOL; +} +?> +--EXPECT-- +pg_query() expects at most 2 arguments, 3 given +pg_query_params() expects at most 3 arguments, 4 given +pg_prepare() expects at most 3 arguments, 4 given +pg_set_error_verbosity() expects at most 2 arguments, 3 given +pg_set_client_encoding() expects at most 2 arguments, 3 given +pg_put_line() expects at most 2 arguments, 3 given +pg_field_is_null() expects at most 3 arguments, 4 given