Move custom type checks to ZPP

Closes GH-6034
This commit is contained in:
Máté Kocsis 2020-08-24 20:42:29 +02:00
parent ddc2a2d381
commit 3e800e997b
No known key found for this signature in database
GPG key ID: FD055E41728BF310
19 changed files with 117 additions and 122 deletions

View file

@ -816,7 +816,7 @@ try_again:
} else { } else {
/* Previously we used strtol here, not is_numeric_string, /* Previously we used strtol here, not is_numeric_string,
* and strtol gives you LONG_MAX/_MIN on overflow. * and strtol gives you LONG_MAX/_MIN on overflow.
* We use use saturating conversion to emulate strtol()'s * We use saturating conversion to emulate strtol()'s
* behaviour. * behaviour.
*/ */
return zend_dval_to_lval_cap(dval); return zend_dval_to_lval_cap(dval);

View file

@ -3513,8 +3513,8 @@ PHP_FUNCTION(mb_send_mail)
size_t message_len; size_t message_len;
char *subject; char *subject;
size_t subject_len; size_t subject_len;
zval *headers = NULL;
zend_string *extra_cmd = NULL; zend_string *extra_cmd = NULL;
HashTable *headers_ht = NULL;
zend_string *str_headers = NULL, *tmp_headers; zend_string *str_headers = NULL, *tmp_headers;
size_t n, i; size_t n, i;
char *to_r = NULL; char *to_r = NULL;
@ -3560,30 +3560,24 @@ PHP_FUNCTION(mb_send_mail)
Z_PARAM_STRING(subject, subject_len) Z_PARAM_STRING(subject, subject_len)
Z_PARAM_STRING(message, message_len) Z_PARAM_STRING(message, message_len)
Z_PARAM_OPTIONAL Z_PARAM_OPTIONAL
Z_PARAM_ZVAL(headers) Z_PARAM_STR_OR_ARRAY_HT_OR_NULL(str_headers, headers_ht)
Z_PARAM_STR(extra_cmd) Z_PARAM_STR_OR_NULL(extra_cmd)
ZEND_PARSE_PARAMETERS_END(); ZEND_PARSE_PARAMETERS_END();
/* ASCIIZ check */ /* ASCIIZ check */
MAIL_ASCIIZ_CHECK_MBSTRING(to, to_len); MAIL_ASCIIZ_CHECK_MBSTRING(to, to_len);
MAIL_ASCIIZ_CHECK_MBSTRING(subject, subject_len); MAIL_ASCIIZ_CHECK_MBSTRING(subject, subject_len);
MAIL_ASCIIZ_CHECK_MBSTRING(message, message_len); MAIL_ASCIIZ_CHECK_MBSTRING(message, message_len);
if (headers) {
switch(Z_TYPE_P(headers)) { if (str_headers) {
case IS_STRING: tmp_headers = zend_string_init(ZSTR_VAL(str_headers), ZSTR_LEN(str_headers), 0);
tmp_headers = zend_string_init(Z_STRVAL_P(headers), Z_STRLEN_P(headers), 0);
MAIL_ASCIIZ_CHECK_MBSTRING(ZSTR_VAL(tmp_headers), ZSTR_LEN(tmp_headers)); MAIL_ASCIIZ_CHECK_MBSTRING(ZSTR_VAL(tmp_headers), ZSTR_LEN(tmp_headers));
str_headers = php_trim(tmp_headers, NULL, 0, 2); str_headers = php_trim(tmp_headers, NULL, 0, 2);
zend_string_release_ex(tmp_headers, 0); zend_string_release_ex(tmp_headers, 0);
break; } else if (headers_ht) {
case IS_ARRAY: str_headers = php_mail_build_headers(headers_ht);
str_headers = php_mail_build_headers(Z_ARRVAL_P(headers));
break;
default:
zend_argument_value_error(4, "must be of type string|array|null, %s given", zend_zval_type_name(headers));
RETURN_THROWS();
}
} }
if (extra_cmd) { if (extra_cmd) {
MAIL_ASCIIZ_CHECK_MBSTRING(ZSTR_VAL(extra_cmd), ZSTR_LEN(extra_cmd)); MAIL_ASCIIZ_CHECK_MBSTRING(ZSTR_VAL(extra_cmd), ZSTR_LEN(extra_cmd));
} }

View file

@ -77,8 +77,7 @@ function mb_encode_numericentity(string $string, array $convmap, ?string $encodi
function mb_decode_numericentity(string $string, array $convmap, ?string $encoding = null): string {} function mb_decode_numericentity(string $string, array $convmap, ?string $encoding = null): string {}
/** @param string|array|null $additional_headers */ function mb_send_mail(string $to, string $subject, string $message, array|string|null $additional_headers = null, ?string $additional_parameters = null): bool {}
function mb_send_mail(string $to, string $subject, string $message, $additional_headers = null, ?string $additional_parameters = null): bool {}
function mb_get_info(string $type = "all"): array|string|int|false {} function mb_get_info(string $type = "all"): array|string|int|false {}

View file

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead. /* This is a generated file, edit the .stub.php file instead.
* Stub hash: 5ad8a8cf20eeae59713d19135ecccbee243754eb */ * Stub hash: 84096daa0fd395f57401f11e9e79f7c8420e8a93 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_mb_language, 0, 0, MAY_BE_STRING|MAY_BE_BOOL) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_mb_language, 0, 0, MAY_BE_STRING|MAY_BE_BOOL)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, language, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, language, IS_STRING, 1, "null")
@ -178,7 +178,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mb_send_mail, 0, 3, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, to, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, to, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, subject, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, subject, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, message, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, message, IS_STRING, 0)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, additional_headers, "null") ZEND_ARG_TYPE_MASK(0, additional_headers, MAY_BE_ARRAY|MAY_BE_STRING|MAY_BE_NULL, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, additional_parameters, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, additional_parameters, IS_STRING, 1, "null")
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()

View file

@ -266,7 +266,7 @@ function oci_fetch_all($statement_resource, &$output, int $skip = 0, int $maximu
/** /**
* @param resource $statement_resource * @param resource $statement_resource
* @param mixed $output * @param array $output
* @alias oci_fetch_all * @alias oci_fetch_all
* @deprecated * @deprecated
*/ */

View file

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead. /* This is a generated file, edit the .stub.php file instead.
* Stub hash: a5a245b354b48a56c274c8f74c974d92ec430853 */ * Stub hash: 447880a4bc4add36beab835cc07c09a254dc0c2b */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_oci_define_by_name, 0, 3, _IS_BOOL, 0) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_oci_define_by_name, 0, 3, _IS_BOOL, 0)
ZEND_ARG_INFO(0, statement_resource) ZEND_ARG_INFO(0, statement_resource)

View file

@ -57,11 +57,8 @@ function odbc_fetch_into($result_id, &$result_array, int $rownumber = 0): int|fa
/** @param resource $result_id */ /** @param resource $result_id */
function odbc_fetch_row($result_id, int $row_number = UNKNOWN): bool {} function odbc_fetch_row($result_id, int $row_number = UNKNOWN): bool {}
/** /** @param resource $result_id */
* @param resource $result_id function odbc_result($result_id, string|int $field): string|bool|null {}
* @param string|int $field
*/
function odbc_result($result_id, $field): string|bool|null {}
/** @param resource $result_id */ /** @param resource $result_id */
function odbc_result_all($result_id, string $format = ''): int|false {} function odbc_result_all($result_id, string $format = ''): int|false {}

View file

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead. /* This is a generated file, edit the .stub.php file instead.
* Stub hash: 14702a5bd87902871d456de2289f4ae236e5bfa5 */ * Stub hash: cf17952d8c3b88f218bbb8d1c21ba40079574c04 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_odbc_close_all, 0, 0, IS_VOID, 0) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_odbc_close_all, 0, 0, IS_VOID, 0)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
@ -70,7 +70,7 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_odbc_result, 0, 2, MAY_BE_STRING|MAY_BE_BOOL|MAY_BE_NULL) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_odbc_result, 0, 2, MAY_BE_STRING|MAY_BE_BOOL|MAY_BE_NULL)
ZEND_ARG_INFO(0, result_id) ZEND_ARG_INFO(0, result_id)
ZEND_ARG_INFO(0, field) ZEND_ARG_TYPE_MASK(0, field, MAY_BE_STRING|MAY_BE_LONG, NULL)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_odbc_result_all, 0, 1, MAY_BE_LONG|MAY_BE_FALSE) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_odbc_result_all, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)

View file

@ -1736,31 +1736,31 @@ PHP_FUNCTION(odbc_fetch_row)
PHP_FUNCTION(odbc_result) PHP_FUNCTION(odbc_result)
{ {
char *field; char *field;
zend_string *field_str; zend_string *field_str, *pv_field_str;
zend_long pv_field_long;
int field_ind; int field_ind;
SQLSMALLINT sql_c_type = SQL_C_CHAR; SQLSMALLINT sql_c_type = SQL_C_CHAR;
odbc_result *result; odbc_result *result;
int i = 0; int i = 0;
RETCODE rc; RETCODE rc;
SQLLEN fieldsize; SQLLEN fieldsize;
zval *pv_res, *pv_field; zval *pv_res;
#ifdef HAVE_SQL_EXTENDED_FETCH #ifdef HAVE_SQL_EXTENDED_FETCH
SQLULEN crow; SQLULEN crow;
SQLUSMALLINT RowStatus[1]; SQLUSMALLINT RowStatus[1];
#endif #endif
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_RESOURCE(pv_res)
Z_PARAM_STR_OR_LONG(pv_field_str, pv_field_long)
ZEND_PARSE_PARAMETERS_END();
if (pv_field_str) {
field = ZSTR_VAL(pv_field_str);
field_ind = -1; field_ind = -1;
field = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz", &pv_res, &pv_field) == FAILURE) {
RETURN_THROWS();
}
if (Z_TYPE_P(pv_field) == IS_STRING) {
field = Z_STRVAL_P(pv_field);
} else { } else {
convert_to_long_ex(pv_field); field = NULL;
field_ind = Z_LVAL_P(pv_field) - 1; field_ind = (int) pv_field_long - 1;
} }
if ((result = (odbc_result *)zend_fetch_resource(Z_RES_P(pv_res), "ODBC result", le_result)) == NULL) { if ((result = (odbc_result *)zend_fetch_resource(Z_RES_P(pv_res), "ODBC result", le_result)) == NULL) {

View file

@ -28,6 +28,6 @@ parse(3015809298423721);
parse(20); parse(20);
?> ?>
--EXPECTF-- --EXPECTF--
Notice: xml_parser_set_option(): tagstart ignored, because it is out of range in %s%ebug72714.php on line %d Warning: xml_parser_set_option(): tagstart ignored, because it is out of range in %s on line %d
string(9) "NS1:TOTAL" string(9) "NS1:TOTAL"
string(0) "" string(0) ""

View file

@ -78,8 +78,8 @@ $values = array(
foreach($values as $value) { foreach($values as $value) {
echo @"\nArg value $value \n"; echo @"\nArg value $value \n";
var_dump( xml_parser_set_option($parser, $option, $value) ); var_dump(xml_parser_set_option($parser, $option, $value));
}; }
fclose($fp); fclose($fp);
xml_parser_free($parser); xml_parser_free($parser);

View file

@ -1427,7 +1427,7 @@ PHP_FUNCTION(xml_parser_set_option)
case PHP_XML_OPTION_SKIP_TAGSTART: case PHP_XML_OPTION_SKIP_TAGSTART:
parser->toffset = zval_get_long(val); parser->toffset = zval_get_long(val);
if (parser->toffset < 0) { if (parser->toffset < 0) {
php_error_docref(NULL, E_NOTICE, "tagstart ignored, because it is out of range"); php_error_docref(NULL, E_WARNING, "tagstart ignored, because it is out of range");
parser->toffset = 0; parser->toffset = 0;
} }
break; break;
@ -1445,6 +1445,7 @@ PHP_FUNCTION(xml_parser_set_option)
zend_argument_value_error(3, "is not a supported target encoding"); zend_argument_value_error(3, "is not a supported target encoding");
RETURN_THROWS(); RETURN_THROWS();
} }
parser->target_encoding = enc->name; parser->target_encoding = enc->name;
break; break;
} }

View file

@ -25,11 +25,8 @@ class XSLTProcessor
*/ */
public function transformToXml(object $document) {} public function transformToXml(object $document) {}
/** /** @return bool */
* @param string|array $name public function setParameter(string $namespace, array|string $name, ?string $value = null) {}
* @return bool
*/
public function setParameter(string $namespace, $name, string $value = UNKNOWN) {}
/** @return string|false */ /** @return string|false */
public function getParameter(string $namespace, string $name) {} public function getParameter(string $namespace, string $name) {}
@ -40,11 +37,8 @@ class XSLTProcessor
/** @return bool */ /** @return bool */
public function hasExsltSupport() {} public function hasExsltSupport() {}
/** /** @return void */
* @param string|array|null $restrict public function registerPHPFunctions(array|string|null $restrict = null) {}
* @return void
*/
public function registerPHPFunctions($restrict = null) {}
/** @return bool */ /** @return bool */
public function setProfiling(?string $filename) {} public function setProfiling(?string $filename) {}

View file

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead. /* This is a generated file, edit the .stub.php file instead.
* Stub hash: 13fd80938fec3bea7ac4bbcfb6e0b69b230fba72 */ * Stub hash: 4a3997bafb6c17714ee94443837be2d2842386e2 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XSLTProcessor_importStylesheet, 0, 0, 1) ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XSLTProcessor_importStylesheet, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, stylesheet, IS_OBJECT, 0) ZEND_ARG_TYPE_INFO(0, stylesheet, IS_OBJECT, 0)
@ -21,8 +21,8 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XSLTProcessor_setParameter, 0, 0, 2) ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XSLTProcessor_setParameter, 0, 0, 2)
ZEND_ARG_TYPE_INFO(0, namespace, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, namespace, IS_STRING, 0)
ZEND_ARG_INFO(0, name) ZEND_ARG_TYPE_MASK(0, name, MAY_BE_ARRAY|MAY_BE_STRING, NULL)
ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, value, IS_STRING, 1, "null")
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XSLTProcessor_getParameter, 0, 0, 2) ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XSLTProcessor_getParameter, 0, 0, 2)
@ -36,7 +36,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XSLTProcessor_hasExsltSupport, 0, 0, 0)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XSLTProcessor_registerPHPFunctions, 0, 0, 0) ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XSLTProcessor_registerPHPFunctions, 0, 0, 0)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, restrict, "null") ZEND_ARG_TYPE_MASK(0, restrict, MAY_BE_ARRAY|MAY_BE_STRING|MAY_BE_NULL, "null")
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XSLTProcessor_setProfiling, 0, 0, 1) ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XSLTProcessor_setProfiling, 0, 0, 1)

View file

@ -4,20 +4,23 @@ Check xsltprocessor::setparameter error handling with no-string
Memleak: http://bugs.php.net/bug.php?id=48221 Memleak: http://bugs.php.net/bug.php?id=48221
--SKIPIF-- --SKIPIF--
<?php <?php
if (!extension_loaded('xsl')) { if (!extension_loaded('xsl')) {
die("skip\n"); die("skip\n");
} }
?> ?>
--FILE-- --FILE--
<?php <?php
include __DIR__ .'/prepare.inc'; include __DIR__ .'/prepare.inc';
$proc->importStylesheet($xsl); $proc->importStylesheet($xsl);
var_dump($proc->setParameter('', array(4, 'abc'))); try {
$proc->setParameter('', array(4, 'abc'));
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
$proc->transformToXml($dom); $proc->transformToXml($dom);
?> ?>
--EXPECTF-- --EXPECT--
Warning: XSLTProcessor::setParameter(): Invalid parameter array in %s on line %d XSLTProcessor::setParameter(): Argument #2 ($name) must contain only string keys
bool(false)
--CREDITS-- --CREDITS--
Christian Weiske, cweiske@php.net Christian Weiske, cweiske@php.net
PHP Testfest Berlin 2009-05-09 PHP Testfest Berlin 2009-05-09

View file

@ -666,21 +666,35 @@ PHP_METHOD(XSLTProcessor, setParameter)
{ {
zval *id = ZEND_THIS; zval *id = ZEND_THIS;
zval *array_value, *entry, new_string; zval *entry, new_string;
HashTable *array_value;
xsl_object *intern; xsl_object *intern;
char *namespace; char *namespace;
size_t namespace_len; size_t namespace_len;
zend_string *string_key, *name, *value; zend_string *string_key, *name, *value = NULL;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_STRING(namespace, namespace_len)
Z_PARAM_STR_OR_ARRAY_HT(name, array_value)
Z_PARAM_OPTIONAL
Z_PARAM_STR_OR_NULL(value)
ZEND_PARSE_PARAMETERS_END();
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "sa", &namespace, &namespace_len, &array_value) == SUCCESS) {
intern = Z_XSL_P(id); intern = Z_XSL_P(id);
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(array_value), string_key, entry) {
if (array_value) {
if (value) {
zend_argument_value_error(3, "must be null when argument #2 ($name) is an array");
RETURN_THROWS();
}
ZEND_HASH_FOREACH_STR_KEY_VAL(array_value, string_key, entry) {
zval tmp; zval tmp;
zend_string *str; zend_string *str;
if (string_key == NULL) { if (string_key == NULL) {
php_error_docref(NULL, E_WARNING, "Invalid parameter array"); zend_argument_type_error(2, "must contain only string keys");
RETURN_FALSE; RETURN_THROWS();
} }
str = zval_try_get_string(entry); str = zval_try_get_string(entry);
if (UNEXPECTED(!str)) { if (UNEXPECTED(!str)) {
@ -690,18 +704,17 @@ PHP_METHOD(XSLTProcessor, setParameter)
zend_hash_update(intern->parameter, string_key, &tmp); zend_hash_update(intern->parameter, string_key, &tmp);
} ZEND_HASH_FOREACH_END(); } ZEND_HASH_FOREACH_END();
RETURN_TRUE; RETURN_TRUE;
} else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "sSS", &namespace, &namespace_len, &name, &value) == SUCCESS) { } else {
if (!value) {
intern = Z_XSL_P(id); zend_argument_value_error(3, "cannot be null when argument #2 ($name) is a string");
RETURN_THROWS();
}
ZVAL_STR_COPY(&new_string, value); ZVAL_STR_COPY(&new_string, value);
zend_hash_update(intern->parameter, name, &new_string); zend_hash_update(intern->parameter, name, &new_string);
RETURN_TRUE; RETURN_TRUE;
} else {
WRONG_PARAM_COUNT;
} }
} }
/* }}} end XSLTProcessor::setParameter */ /* }}} end XSLTProcessor::setParameter */

View file

@ -2712,16 +2712,20 @@ PHP_METHOD(ZipArchive, extractTo)
struct zip *intern; struct zip *intern;
zval *self = ZEND_THIS; zval *self = ZEND_THIS;
zval *zval_files = NULL; zend_string *files_str = NULL;
HashTable *files_ht = NULL;
zval *zval_file = NULL; zval *zval_file = NULL;
php_stream_statbuf ssb; php_stream_statbuf ssb;
char *pathto; char *pathto;
size_t pathto_len; size_t pathto_len;
int ret; int ret;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|z", &pathto, &pathto_len, &zval_files) == FAILURE) { ZEND_PARSE_PARAMETERS_START(1, 2)
RETURN_THROWS(); Z_PARAM_PATH(pathto, pathto_len)
} Z_PARAM_OPTIONAL
Z_PARAM_STR_OR_ARRAY_HT_OR_NULL(files_str, files_ht)
ZEND_PARSE_PARAMETERS_END();
ZIP_FROM_OBJECT(intern, self); ZIP_FROM_OBJECT(intern, self);
@ -2736,22 +2740,19 @@ PHP_METHOD(ZipArchive, extractTo)
} }
} }
if (zval_files && Z_TYPE_P(zval_files) != IS_NULL) {
uint32_t nelems, i; uint32_t nelems, i;
switch (Z_TYPE_P(zval_files)) { if (files_str) {
case IS_STRING: if (!php_zip_extract_file(intern, pathto, ZSTR_VAL(files_str), ZSTR_LEN(files_str))) {
if (!php_zip_extract_file(intern, pathto, Z_STRVAL_P(zval_files), Z_STRLEN_P(zval_files))) {
RETURN_FALSE; RETURN_FALSE;
} }
break; } else if (files_ht) {
case IS_ARRAY: nelems = zend_hash_num_elements(files_ht);
nelems = zend_hash_num_elements(Z_ARRVAL_P(zval_files));
if (nelems == 0 ) { if (nelems == 0 ) {
RETURN_FALSE; RETURN_FALSE;
} }
for (i = 0; i < nelems; i++) { for (i = 0; i < nelems; i++) {
if ((zval_file = zend_hash_index_find(Z_ARRVAL_P(zval_files), i)) != NULL) { if ((zval_file = zend_hash_index_find(files_ht, i)) != NULL) {
switch (Z_TYPE_P(zval_file)) { switch (Z_TYPE_P(zval_file)) {
case IS_LONG: case IS_LONG:
break; break;
@ -2763,11 +2764,6 @@ PHP_METHOD(ZipArchive, extractTo)
} }
} }
} }
break;
default:
zend_argument_type_error(2, "must be of type array|string|null, %s given", zend_zval_type_name(zval_files));
RETURN_THROWS();
}
} else { } else {
/* Extract all files */ /* Extract all files */
zip_int64_t i, filecount = zip_get_num_entries(intern, 0); zip_int64_t i, filecount = zip_get_num_entries(intern, 0);
@ -2784,6 +2780,7 @@ PHP_METHOD(ZipArchive, extractTo)
} }
} }
} }
RETURN_TRUE; RETURN_TRUE;
} }
/* }}} */ /* }}} */

View file

@ -161,11 +161,8 @@ class ZipArchive
/** @return bool */ /** @return bool */
public function unchangeName(string $name) {} public function unchangeName(string $name) {}
/** /** @return bool */
* @param array|string|null $files public function extractTo(string $pathto, array|string|null $files = null) {}
* @return bool
*/
public function extractTo(string $pathto, $files = null) {}
/** @return string|false */ /** @return string|false */
public function getFromName(string $entryname, int $len = 0, int $flags = 0) {} public function getFromName(string $entryname, int $len = 0, int $flags = 0) {}

View file

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead. /* This is a generated file, edit the .stub.php file instead.
* Stub hash: 880148896a71ad9bd076bb42c735ff1b83cd0731 */ * Stub hash: 49f168c537e48f8a3998d67812a5e2e6a2463533 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_zip_open, 0, 0, 1) ZEND_BEGIN_ARG_INFO_EX(arginfo_zip_open, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@ -175,7 +175,7 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZipArchive_extractTo, 0, 0, 1) ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZipArchive_extractTo, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, pathto, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, pathto, IS_STRING, 0)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, files, "null") ZEND_ARG_TYPE_MASK(0, files, MAY_BE_ARRAY|MAY_BE_STRING|MAY_BE_NULL, "null")
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZipArchive_getFromName, 0, 0, 1) ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZipArchive_getFromName, 0, 0, 1)