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:
Dmitry Stogov 2019-06-07 11:50:19 +03:00
commit 8fbfd8872a
2 changed files with 109 additions and 10 deletions

View File

@ -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) {

View 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