mirror of
https://github.com/php/php-src.git
synced 2024-09-22 10:27:25 +00:00
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fixed bug #77135 (Extract with EXTR_SKIP should skip $this)
This commit is contained in:
commit
8fbfd8872a
@ -2026,6 +2026,7 @@ static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol
|
||||
continue;
|
||||
}
|
||||
}
|
||||
prefix:
|
||||
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), 1);
|
||||
if (php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
|
||||
if (zend_string_equals_literal(Z_STR(final_name), "this")) {
|
||||
@ -2055,8 +2056,7 @@ static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol
|
||||
continue;
|
||||
}
|
||||
if (zend_string_equals_literal(var_name, "this")) {
|
||||
zend_throw_error(NULL, "Cannot re-assign $this");
|
||||
return -1;
|
||||
goto prefix;
|
||||
}
|
||||
if (Z_ISREF_P(entry)) {
|
||||
Z_ADDREF_P(entry);
|
||||
@ -2095,6 +2095,7 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab
|
||||
continue;
|
||||
}
|
||||
}
|
||||
prefix:
|
||||
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), 1);
|
||||
if (php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
|
||||
if (zend_string_equals_literal(Z_STR(final_name), "this")) {
|
||||
@ -2124,8 +2125,7 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab
|
||||
continue;
|
||||
}
|
||||
if (zend_string_equals_literal(var_name, "this")) {
|
||||
zend_throw_error(NULL, "Cannot re-assign $this");
|
||||
return -1;
|
||||
goto prefix;
|
||||
}
|
||||
ZVAL_DEREF(entry);
|
||||
Z_TRY_ADDREF_P(entry);
|
||||
@ -2241,7 +2241,8 @@ static zend_long php_extract_ref_prefix_invalid(zend_array *arr, zend_array *sym
|
||||
|
||||
ZEND_HASH_FOREACH_KEY_VAL_IND(arr, num_key, var_name, entry) {
|
||||
if (var_name) {
|
||||
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))) {
|
||||
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))
|
||||
|| zend_string_equals_literal(var_name, "this")) {
|
||||
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), 1);
|
||||
if (!php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
|
||||
zval_ptr_dtor_str(&final_name);
|
||||
@ -2295,7 +2296,8 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_
|
||||
|
||||
ZEND_HASH_FOREACH_KEY_VAL_IND(arr, num_key, var_name, entry) {
|
||||
if (var_name) {
|
||||
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))) {
|
||||
if (!php_valid_var_name(ZSTR_VAL(var_name), ZSTR_LEN(var_name))
|
||||
|| zend_string_equals_literal(var_name, "this")) {
|
||||
php_prefix_varname(&final_name, prefix, ZSTR_VAL(var_name), ZSTR_LEN(var_name), 1);
|
||||
if (!php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) {
|
||||
zval_ptr_dtor_str(&final_name);
|
||||
@ -2354,8 +2356,7 @@ static zend_long php_extract_ref_skip(zend_array *arr, zend_array *symbol_table)
|
||||
continue;
|
||||
}
|
||||
if (zend_string_equals_literal(var_name, "this")) {
|
||||
zend_throw_error(NULL, "Cannot re-assign $this");
|
||||
return -1;
|
||||
continue;
|
||||
}
|
||||
orig_var = zend_hash_find_ex(symbol_table, var_name, 1);
|
||||
if (orig_var) {
|
||||
@ -2400,8 +2401,7 @@ static zend_long php_extract_skip(zend_array *arr, zend_array *symbol_table) /*
|
||||
continue;
|
||||
}
|
||||
if (zend_string_equals_literal(var_name, "this")) {
|
||||
zend_throw_error(NULL, "Cannot re-assign $this");
|
||||
return -1;
|
||||
continue;
|
||||
}
|
||||
orig_var = zend_hash_find_ex(symbol_table, var_name, 1);
|
||||
if (orig_var) {
|
||||
|
99
ext/standard/tests/array/bug77135.phpt
Normal file
99
ext/standard/tests/array/bug77135.phpt
Normal file
@ -0,0 +1,99 @@
|
||||
--TEST--
|
||||
Test extract() with $this
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class Extract
|
||||
{
|
||||
public function run(): void
|
||||
{
|
||||
$options = [
|
||||
'EXTR_OVERWRITE' => EXTR_OVERWRITE,
|
||||
'EXTR_SKIP' => EXTR_SKIP,
|
||||
'EXTR_PREFIX_SAME' => EXTR_PREFIX_SAME,
|
||||
'EXTR_PREFIX_ALL' => EXTR_PREFIX_ALL,
|
||||
'EXTR_PREFIX_INVALID' => EXTR_PREFIX_INVALID,
|
||||
'EXTR_IF_EXISTS' => EXTR_IF_EXISTS,
|
||||
'EXTR_PREFIX_IF_EXISTS' => EXTR_PREFIX_IF_EXISTS,
|
||||
];
|
||||
|
||||
foreach ($options as $name => $flags) {
|
||||
echo "{$name}\n";
|
||||
|
||||
$this->handle($name, $flags);
|
||||
$this->handle("{$name}_REFS", $flags | EXTR_REFS);
|
||||
echo "\n";
|
||||
}
|
||||
}
|
||||
|
||||
private function handle(string $name, int $flags): void
|
||||
{
|
||||
$array = ["this" => "value"];
|
||||
|
||||
try {
|
||||
$result = extract($array, $flags, "x");
|
||||
echo " extract() = {$result}\n";
|
||||
|
||||
echo " \$this = " . get_class($this) . "\n";
|
||||
echo " \$v_this = " . (isset($x_this) ? $x_this : "NULL") . "\n";
|
||||
} catch (\Throwable $e) {
|
||||
echo " Exception: " . $e->getMessage() . "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
(new Extract)->run();
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
EXTR_OVERWRITE
|
||||
Exception: Cannot re-assign $this
|
||||
Exception: Cannot re-assign $this
|
||||
|
||||
EXTR_SKIP
|
||||
extract() = 0
|
||||
$this = Extract
|
||||
$v_this = NULL
|
||||
extract() = 0
|
||||
$this = Extract
|
||||
$v_this = NULL
|
||||
|
||||
EXTR_PREFIX_SAME
|
||||
extract() = 1
|
||||
$this = Extract
|
||||
$v_this = value
|
||||
extract() = 1
|
||||
$this = Extract
|
||||
$v_this = value
|
||||
|
||||
EXTR_PREFIX_ALL
|
||||
extract() = 1
|
||||
$this = Extract
|
||||
$v_this = value
|
||||
extract() = 1
|
||||
$this = Extract
|
||||
$v_this = value
|
||||
|
||||
EXTR_PREFIX_INVALID
|
||||
extract() = 1
|
||||
$this = Extract
|
||||
$v_this = value
|
||||
extract() = 1
|
||||
$this = Extract
|
||||
$v_this = value
|
||||
|
||||
EXTR_IF_EXISTS
|
||||
extract() = 0
|
||||
$this = Extract
|
||||
$v_this = NULL
|
||||
extract() = 0
|
||||
$this = Extract
|
||||
$v_this = NULL
|
||||
|
||||
EXTR_PREFIX_IF_EXISTS
|
||||
extract() = 0
|
||||
$this = Extract
|
||||
$v_this = NULL
|
||||
extract() = 0
|
||||
$this = Extract
|
||||
$v_this = NULL
|
Loading…
Reference in New Issue
Block a user