Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions Zend/tests/function_arguments/gh20435.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
--TEST--
GH-20435 (SensitiveParameter doesn't work for named argument passing to variadic parameter)
--FILE--
<?php

function test($a, #[\SensitiveParameter] ...$x) {
debug_print_backtrace();
}

test(b: 1, a: 2, c: 3);

?>
--EXPECTF--
#0 %s(%d): test(2, b: Object(SensitiveParameterValue), c: Object(SensitiveParameterValue))
22 changes: 20 additions & 2 deletions Zend/zend_builtin_functions.c
Original file line number Diff line number Diff line change
Expand Up @@ -1849,11 +1849,29 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) /
if (ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
zend_string *name;
zval *arg;

ZEND_ASSERT(call->func->common.fn_flags & ZEND_ACC_VARIADIC);

zend_attribute *attribute = zend_get_parameter_attribute_str(
call->func->common.attributes,
"sensitiveparameter",
sizeof("sensitiveparameter") - 1,
call->func->common.num_args
);
bool is_sensitive = attribute != NULL;

SEPARATE_ARRAY(arg_array);
ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(call->extra_named_params, name, arg) {
ZVAL_DEREF(arg);
Z_TRY_ADDREF_P(arg);
zend_hash_add_new(Z_ARRVAL_P(arg_array), name, arg);
if (is_sensitive) {
zval redacted_arg;
object_init_ex(&redacted_arg, zend_ce_sensitive_parameter_value);
zend_call_method_with_1_params(Z_OBJ_P(&redacted_arg), zend_ce_sensitive_parameter_value, &zend_ce_sensitive_parameter_value->constructor, "__construct", NULL, arg);
zend_hash_add_new(Z_ARRVAL_P(arg_array), name, &redacted_arg);
} else {
Z_TRY_ADDREF_P(arg);
zend_hash_add_new(Z_ARRVAL_P(arg_array), name, arg);
}
} ZEND_HASH_FOREACH_END();
}
}
Expand Down
36 changes: 4 additions & 32 deletions ext/phar/phar.c
Original file line number Diff line number Diff line change
Expand Up @@ -1558,35 +1558,6 @@ zend_result phar_open_from_filename(char *fname, size_t fname_len, char *alias,
}
/* }}}*/

static inline char *phar_strnstr(const char *buf, size_t buf_len, const char *search, size_t search_len) /* {{{ */
{
const char *c;
ptrdiff_t so_far = 0;

if (buf_len < search_len) {
return NULL;
}

c = buf - 1;

do {
if (!(c = memchr(c + 1, search[0], buf_len - search_len - so_far))) {
return (char *) NULL;
}

so_far = c - buf;

if (so_far >= (buf_len - search_len)) {
return (char *) NULL;
}

if (!memcmp(c, search, search_len)) {
return (char *) c;
}
} while (1);
}
/* }}} */

/**
* Scan an open fp for the required __HALT_COMPILER(); ?> token and verify
* that the manifest is proper, then pass it to phar_parse_pharfile(). SUCCESS
Expand All @@ -1598,7 +1569,8 @@ static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_l
static const char zip_magic[] = "PK\x03\x04";
static const char gz_magic[] = "\x1f\x8b\x08";
static const char bz_magic[] = "BZh";
char *pos, test = '\0';
const char *pos;
char test = '\0';
int recursion_count = 3; // arbitrary limit to avoid too deep or even infinite recursion
const int window_size = 1024;
char buffer[1024 + sizeof(token)]; /* a 1024 byte window + the size of the halt_compiler token (moving window) */
Expand Down Expand Up @@ -1747,14 +1719,14 @@ static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_l
}

if (got >= 512) {
if (phar_is_tar(pos, fname)) {
if (phar_is_tar((char *) pos, fname)) { /* TODO: fix const correctness */
php_stream_rewind(fp);
return phar_parse_tarfile(fp, fname, fname_len, alias, alias_len, pphar, compression, error);
}
}
}

if (got > 0 && (pos = phar_strnstr(buffer, got + sizeof(token), token, sizeof(token)-1)) != NULL) {
if (got > 0 && (pos = php_memnistr(buffer, token, tokenlen, buffer + got + sizeof(token))) != NULL) {
halt_offset += (pos - buffer); /* no -tokenlen+tokenlen here */
return phar_parse_pharfile(fp, fname, fname_len, alias, alias_len, halt_offset, pphar, compression, error);
}
Expand Down
Binary file added ext/phar/tests/files/gh20442.phar
Binary file not shown.
18 changes: 18 additions & 0 deletions ext/phar/tests/gh20442.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
--TEST--
GH-20442 (Phar does not respect case-insensitiveness of __halt_compiler() when reading stub)
--EXTENSIONS--
phar
--FILE--
<?php

$phar = new Phar(__DIR__.'/files/gh20442.phar');
var_dump($phar->count());
var_dump($phar->getStub());

?>
--EXPECT--
int(1)
string(50) "<?php
echo "Hello World!";
__halt_compiler(); ?>
"
8 changes: 2 additions & 6 deletions ext/spl/php_spl.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,9 +216,7 @@ PHP_FUNCTION(class_uses)
/* {{{ Return an array containing the names of all classes and interfaces defined in SPL */
PHP_FUNCTION(spl_classes)
{
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

array_init(return_value);

Expand Down Expand Up @@ -619,9 +617,7 @@ PHP_FUNCTION(spl_autoload_functions)
{
autoload_func_info *alfi;

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

array_init(return_value);
if (spl_autoload_functions) {
Expand Down
60 changes: 15 additions & 45 deletions ext/spl/spl_array.c
Original file line number Diff line number Diff line change
Expand Up @@ -753,9 +753,7 @@ PHP_METHOD(ArrayObject, getArrayCopy)
zval *object = ZEND_THIS;
spl_array_object *intern = Z_SPLARRAY_P(object);

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

RETURN_ARR(zend_array_dup(spl_array_get_hash_table(intern)));
} /* }}} */
Expand Down Expand Up @@ -1086,9 +1084,7 @@ PHP_METHOD(ArrayObject, getIteratorClass)
zval *object = ZEND_THIS;
spl_array_object *intern = Z_SPLARRAY_P(object);

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

zend_string_addref(intern->ce_get_iterator->name);
RETURN_STR(intern->ce_get_iterator->name);
Expand All @@ -1101,9 +1097,7 @@ PHP_METHOD(ArrayObject, getFlags)
zval *object = ZEND_THIS;
spl_array_object *intern = Z_SPLARRAY_P(object);

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

RETURN_LONG(intern->ar_flags & ~SPL_ARRAY_INT_MASK);
}
Expand Down Expand Up @@ -1150,9 +1144,7 @@ PHP_METHOD(ArrayObject, getIterator)
zval *object = ZEND_THIS;
spl_array_object *intern = Z_SPLARRAY_P(object);

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

RETURN_OBJ(spl_array_object_new_ex(intern->ce_get_iterator, Z_OBJ_P(object), 0));
}
Expand Down Expand Up @@ -1203,9 +1195,7 @@ PHP_METHOD(ArrayObject, count)
{
spl_array_object *intern = Z_SPLARRAY_P(ZEND_THIS);

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

RETURN_LONG(spl_array_object_count_elements_helper(intern));
} /* }}} */
Expand Down Expand Up @@ -1305,9 +1295,7 @@ PHP_METHOD(ArrayObject, serialize)
php_serialize_data_t var_hash;
smart_str buf = {0};

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

PHP_VAR_SERIALIZE_INIT(var_hash);

Expand Down Expand Up @@ -1453,9 +1441,7 @@ PHP_METHOD(ArrayObject, __serialize)
spl_array_object *intern = Z_SPLARRAY_P(ZEND_THIS);
zval tmp;

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

array_init(return_value);

Expand Down Expand Up @@ -1559,9 +1545,7 @@ PHP_METHOD(ArrayObject, __unserialize)
/* {{{ */
PHP_METHOD(ArrayObject, __debugInfo)
{
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

RETURN_ARR(spl_array_get_debug_info(Z_OBJ_P(ZEND_THIS)));
} /* }}} */
Expand Down Expand Up @@ -1739,9 +1723,7 @@ PHP_METHOD(ArrayIterator, rewind)
zval *object = ZEND_THIS;
spl_array_object *intern = Z_SPLARRAY_P(object);

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

spl_array_rewind(intern);
}
Expand Down Expand Up @@ -1783,9 +1765,7 @@ PHP_METHOD(ArrayIterator, current)
zval *entry;
HashTable *aht = spl_array_get_hash_table(intern);

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

if ((entry = zend_hash_get_current_data_ex(aht, spl_array_get_pos_ptr(aht, intern))) == NULL) {
RETURN_NULL();
Expand All @@ -1812,9 +1792,7 @@ void spl_array_iterator_key(zval *object, zval *return_value) /* {{{ */
/* {{{ Return current array key */
PHP_METHOD(ArrayIterator, key)
{
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

spl_array_iterator_key(ZEND_THIS, return_value);
} /* }}} */
Expand All @@ -1826,9 +1804,7 @@ PHP_METHOD(ArrayIterator, next)
spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern);

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

spl_array_next_ex(intern, aht);
}
Expand All @@ -1841,9 +1817,7 @@ PHP_METHOD(ArrayIterator, valid)
spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern);

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

RETURN_BOOL(zend_hash_has_more_elements_ex(aht, spl_array_get_pos_ptr(aht, intern)) == SUCCESS);
}
Expand All @@ -1858,9 +1832,7 @@ PHP_METHOD(RecursiveArrayIterator, hasChildren)
spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern);

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

if ((entry = zend_hash_get_current_data_ex(aht, spl_array_get_pos_ptr(aht, intern))) == NULL) {
RETURN_FALSE;
Expand Down Expand Up @@ -1898,9 +1870,7 @@ PHP_METHOD(RecursiveArrayIterator, getChildren)
spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern);

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();

if ((entry = zend_hash_get_current_data_ex(aht, spl_array_get_pos_ptr(aht, intern))) == NULL) {
RETURN_NULL();
Expand Down
Loading