diff options
| author | Nikita Popov <nikita.ppv@gmail.com> | 2018-07-03 22:44:41 +0200 |
|---|---|---|
| committer | Nikita Popov <nikita.ppv@gmail.com> | 2018-07-03 22:45:35 +0200 |
| commit | e080fb6d92b7ed942613388be6f5b4c7e6d74e05 (patch) | |
| tree | 261a61e9722e6c32df9ed9462481f36a226ad1bc | |
| parent | 2af3234a09416e28eb32df7f9ba77a07f8669d0c (diff) | |
| download | php-git-e080fb6d92b7ed942613388be6f5b4c7e6d74e05.tar.gz | |
Do not continue extract()ing after an exception has been thrown
Make behavior consistent with a loop of normal assignments.
This is not a big issue now, because $this is the only case that
may generate an error. However typed references introduce additional
error conditions, which would be silenced by this kind of behavior.
| -rw-r--r-- | Zend/tests/this_in_extract.phpt | 18 | ||||
| -rw-r--r-- | ext/standard/array.c | 118 |
2 files changed, 42 insertions, 94 deletions
diff --git a/Zend/tests/this_in_extract.phpt b/Zend/tests/this_in_extract.phpt index de8da3d0a5..9903d7d794 100644 --- a/Zend/tests/this_in_extract.phpt +++ b/Zend/tests/this_in_extract.phpt @@ -3,15 +3,17 @@ $this re-assign in extract() --FILE-- <?php function foo() { - extract(["this"=>42]); - var_dump($this); + try { + extract(["this"=>42, "a"=>24]); + } catch (Error $e) { + echo $e->getMessage(), "\n"; + } + var_dump($a); } foo(); ?> --EXPECTF-- -Fatal error: Uncaught Error: Cannot re-assign $this in %sthis_in_extract.php:3 -Stack trace: -#0 %sthis_in_extract.php(3): extract(Array) -#1 %sthis_in_extract.php(6): foo() -#2 {main} - thrown in %sthis_in_extract.php on line 3 +Cannot re-assign $this + +Notice: Undefined variable: a in %s on line %d +NULL diff --git a/ext/standard/array.c b/ext/standard/array.c index 42a8b8a2ec..84671b965a 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1730,7 +1730,6 @@ PHPAPI int php_prefix_varname(zval *result, const zval *prefix, const char *var_ static zend_long php_extract_ref_if_exists(zend_array *arr, zend_array *symbol_table) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zval *entry, *orig_var; @@ -1754,11 +1753,8 @@ static zend_long php_extract_ref_if_exists(zend_array *arr, zend_array *symbol_t continue; } if (zend_string_equals_literal(var_name, "this")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } - continue; + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } if (Z_ISREF_P(entry)) { Z_ADDREF_P(entry); @@ -1777,7 +1773,6 @@ static zend_long php_extract_ref_if_exists(zend_array *arr, zend_array *symbol_t static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zval *entry, *orig_var; @@ -1801,11 +1796,8 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table continue; } if (zend_string_equals_literal(var_name, "this")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } - continue; + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } ZVAL_DEREF(entry); ZVAL_DEREF(orig_var); @@ -1821,7 +1813,6 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table static zend_long php_extract_ref_overwrite(zend_array *arr, zend_array *symbol_table) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zval *entry, *orig_var; @@ -1834,11 +1825,8 @@ static zend_long php_extract_ref_overwrite(zend_array *arr, zend_array *symbol_t continue; } if (zend_string_equals_literal(var_name, "this")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } - continue; + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } orig_var = zend_hash_find_ex(symbol_table, var_name, 1); if (orig_var) { @@ -1872,7 +1860,6 @@ static zend_long php_extract_ref_overwrite(zend_array *arr, zend_array *symbol_t static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zval *entry, *orig_var; @@ -1885,11 +1872,8 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table continue; } if (zend_string_equals_literal(var_name, "this")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } - continue; + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } orig_var = zend_hash_find_ex(symbol_table, var_name, 1); if (orig_var) { @@ -1917,7 +1901,6 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table static zend_long php_extract_ref_prefix_if_exists(zend_array *arr, zend_array *symbol_table, zval *prefix) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zval *entry, *orig_var, final_name; @@ -1944,10 +1927,8 @@ static zend_long php_extract_ref_prefix_if_exists(zend_array *arr, zend_array *s 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")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } else { if (Z_ISREF_P(entry)) { Z_ADDREF_P(entry); @@ -1976,7 +1957,6 @@ static zend_long php_extract_ref_prefix_if_exists(zend_array *arr, zend_array *s static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbol_table, zval *prefix) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zval *entry, *orig_var, final_name; @@ -1999,10 +1979,8 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo 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")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } else { ZVAL_DEREF(entry); if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) { @@ -2029,7 +2007,6 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol_table, zval *prefix) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zval *entry, *orig_var, final_name; @@ -2059,10 +2036,8 @@ static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol 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")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } else { if (Z_ISREF_P(entry)) { Z_ADDREF_P(entry); @@ -2087,11 +2062,8 @@ static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol continue; } if (zend_string_equals_literal(var_name, "this")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } - continue; + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } if (Z_ISREF_P(entry)) { Z_ADDREF_P(entry); @@ -2109,7 +2081,6 @@ static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_table, zval *prefix) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zval *entry, *orig_var, final_name; @@ -2135,10 +2106,8 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab 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")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } else { ZVAL_DEREF(entry); if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) { @@ -2161,11 +2130,8 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab continue; } if (zend_string_equals_literal(var_name, "this")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } - continue; + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } ZVAL_DEREF(entry); Z_TRY_ADDREF_P(entry); @@ -2180,7 +2146,6 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab static zend_long php_extract_ref_prefix_all(zend_array *arr, zend_array *symbol_table, zval *prefix) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zend_ulong num_key; @@ -2199,10 +2164,8 @@ static zend_long php_extract_ref_prefix_all(zend_array *arr, zend_array *symbol_ } if (php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) { if (zend_string_equals_literal(Z_STR(final_name), "this")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } else { if (Z_ISREF_P(entry)) { Z_ADDREF_P(entry); @@ -2230,7 +2193,6 @@ static zend_long php_extract_ref_prefix_all(zend_array *arr, zend_array *symbol_ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_table, zval *prefix) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zend_ulong num_key; @@ -2249,10 +2211,8 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl } if (php_valid_var_name(Z_STRVAL(final_name), Z_STRLEN(final_name))) { if (zend_string_equals_literal(Z_STR(final_name), "this")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } else { ZVAL_DEREF(entry); if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) { @@ -2278,7 +2238,6 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl static zend_long php_extract_ref_prefix_invalid(zend_array *arr, zend_array *symbol_table, zval *prefix) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zend_ulong num_key; @@ -2305,10 +2264,8 @@ static zend_long php_extract_ref_prefix_invalid(zend_array *arr, zend_array *sym } } if (zend_string_equals_literal(Z_STR(final_name), "this")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } else { if (Z_ISREF_P(entry)) { Z_ADDREF_P(entry); @@ -2335,7 +2292,6 @@ static zend_long php_extract_ref_prefix_invalid(zend_array *arr, zend_array *sym static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_table, zval *prefix) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zend_ulong num_key; @@ -2362,10 +2318,8 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_ } } if (zend_string_equals_literal(Z_STR(final_name), "this")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } else { ZVAL_DEREF(entry); if ((orig_var = zend_hash_find(symbol_table, Z_STR(final_name))) != NULL) { @@ -2390,7 +2344,6 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_ static zend_long php_extract_ref_skip(zend_array *arr, zend_array *symbol_table) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zval *entry, *orig_var; @@ -2403,11 +2356,8 @@ static zend_long php_extract_ref_skip(zend_array *arr, zend_array *symbol_table) continue; } if (zend_string_equals_literal(var_name, "this")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } - continue; + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } orig_var = zend_hash_find_ex(symbol_table, var_name, 1); if (orig_var) { @@ -2440,7 +2390,6 @@ static zend_long php_extract_ref_skip(zend_array *arr, zend_array *symbol_table) static zend_long php_extract_skip(zend_array *arr, zend_array *symbol_table) /* {{{ */ { - int exception_thrown = 0; zend_long count = 0; zend_string *var_name; zval *entry, *orig_var; @@ -2453,11 +2402,8 @@ static zend_long php_extract_skip(zend_array *arr, zend_array *symbol_table) /* continue; } if (zend_string_equals_literal(var_name, "this")) { - if (!exception_thrown) { - exception_thrown = 1; - zend_throw_error(NULL, "Cannot re-assign $this"); - } - continue; + zend_throw_error(NULL, "Cannot re-assign $this"); + return -1; } orig_var = zend_hash_find_ex(symbol_table, var_name, 1); if (orig_var) { |
