From 675e975185b21b99dbc5ca47cf2fdd4cd79e68a1 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 21 Aug 2019 19:35:35 +0200 Subject: [PATCH] Promote warning to error in zend_forbid_dynamic_call() --- Zend/tests/bug71221.phpt | 12 +++- Zend/tests/bug72107.phpt | 12 ++-- Zend/tests/dynamic_call_005.phpt | 37 ++++++++----- Zend/tests/dynamic_call_006.phpt | 76 ++++++++++++++++---------- Zend/tests/dynamic_call_007.phpt | 10 +++- Zend/tests/dynamic_call_008.phpt | 10 +++- Zend/zend_API.h | 2 +- ext/standard/tests/array/bug71220.phpt | 12 +++- 8 files changed, 110 insertions(+), 61 deletions(-) diff --git a/Zend/tests/bug71221.phpt b/Zend/tests/bug71221.phpt index 0f6ee16946..eeba6450ab 100644 --- a/Zend/tests/bug71221.phpt +++ b/Zend/tests/bug71221.phpt @@ -3,8 +3,14 @@ Bug #71221 (Null pointer deref (segfault) in get_defined_vars via ob_start) --FILE-- getMessage(); +} ?> -okey + +OKAY --EXPECT-- -okey +Cannot call get_defined_vars() dynamically +OKAY diff --git a/Zend/tests/bug72107.phpt b/Zend/tests/bug72107.phpt index 3f4c46cf70..c22f657ebb 100644 --- a/Zend/tests/bug72107.phpt +++ b/Zend/tests/bug72107.phpt @@ -6,9 +6,11 @@ set_error_handler('func_get_args'); function test($a) { echo $undef; } -test(1); +try { + test(1); +} catch (\Error $e) { + echo $e->getMessage(); +} ?> ---EXPECTF-- -Warning: Cannot call func_get_args() dynamically in %s on line %d - -Notice: Undefined variable: undef in %s on line %d +--EXPECT-- +Cannot call func_get_args() dynamically diff --git a/Zend/tests/dynamic_call_005.phpt b/Zend/tests/dynamic_call_005.phpt index 840e298b82..91d1cb914c 100644 --- a/Zend/tests/dynamic_call_005.phpt +++ b/Zend/tests/dynamic_call_005.phpt @@ -6,24 +6,31 @@ Dynamic calls to scope introspection functions are forbidden function test_calls($func) { $i = 1; - array_map($func, [['i' => new stdClass]]); - var_dump($i); + try { + array_map($func, [['i' => new stdClass]]); + var_dump($i); + } catch (\Error $e) { + echo $e->getMessage() . "\n"; + } - $func(['i' => new stdClass]); - var_dump($i); + try { + $func(['i' => new stdClass]); + var_dump($i); + } catch (\Error $e) { + echo $e->getMessage() . "\n"; + } - call_user_func($func, ['i' => new stdClass]); - var_dump($i); + try { + call_user_func($func, ['i' => new stdClass]); + var_dump($i); + } catch (\Error $e) { + echo $e->getMessage() . "\n"; + } } test_calls('extract'); ?> ---EXPECTF-- -Warning: Cannot call extract() dynamically in %s on line %d -int(1) - -Warning: Cannot call extract() dynamically in %s on line %d -int(1) - -Warning: Cannot call extract() dynamically in %s on line %d -int(1) +--EXPECT-- +Cannot call extract() dynamically +Cannot call extract() dynamically +Cannot call extract() dynamically diff --git a/Zend/tests/dynamic_call_006.phpt b/Zend/tests/dynamic_call_006.phpt index 7a2872bcca..e6ea719158 100644 --- a/Zend/tests/dynamic_call_006.phpt +++ b/Zend/tests/dynamic_call_006.phpt @@ -3,36 +3,56 @@ Dynamic calls to scope introspection functions are forbidden (function variation --FILE-- 'b']); - $func = 'compact'; - $func(['a']); - - $func = 'get_defined_vars'; - $func(); - - $func = 'func_get_args'; - $func(); - - $func = 'func_get_arg'; - $func(1); - - $func = 'func_num_args'; - $func(); + try { + $func = 'extract'; + $func(['a' => 'b']); + } catch (\Error $e) { + echo $e->getMessage() . "\n"; + } + + try { + $func = 'compact'; + $func(['a']); + } catch (\Error $e) { + echo $e->getMessage() . "\n"; + } + + try { + $func = 'get_defined_vars'; + $func(); + } catch (\Error $e) { + echo $e->getMessage() . "\n"; + } + + try { + $func = 'func_get_args'; + $func(); + } catch (\Error $e) { + echo $e->getMessage() . "\n"; + } + + try { + $func = 'func_get_arg'; + $func(1); + } catch (\Error $e) { + echo $e->getMessage() . "\n"; + } + + try { + $func = 'func_num_args'; + $func(); + } catch (\Error $e) { + echo $e->getMessage() . "\n"; + } } test(); ?> ---EXPECTF-- -Warning: Cannot call extract() dynamically in %s on line %d - -Warning: Cannot call compact() dynamically in %s on line %d - -Warning: Cannot call get_defined_vars() dynamically in %s on line %d - -Warning: Cannot call func_get_args() dynamically in %s on line %d - -Warning: Cannot call func_get_arg() dynamically in %s on line %d - -Warning: Cannot call func_num_args() dynamically in %s on line %d +--EXPECT-- +Cannot call extract() dynamically +Cannot call compact() dynamically +Cannot call get_defined_vars() dynamically +Cannot call func_get_args() dynamically +Cannot call func_get_arg() dynamically +Cannot call func_num_args() dynamically diff --git a/Zend/tests/dynamic_call_007.phpt b/Zend/tests/dynamic_call_007.phpt index 61ae182914..f1312b95b4 100644 --- a/Zend/tests/dynamic_call_007.phpt +++ b/Zend/tests/dynamic_call_007.phpt @@ -5,13 +5,17 @@ Dynamic calls to scope introspection functions are forbidden (misoptimization) function test() { $i = 1; - array_map('extract', [['i' => new stdClass]]); + try { + array_map('extract', [['i' => new stdClass]]); + } catch (\Error $e) { + echo $e->getMessage() . "\n"; + } $i += 1; var_dump($i); } test(); ?> ---EXPECTF-- -Warning: Cannot call extract() dynamically in %s on line %d +--EXPECT-- +Cannot call extract() dynamically int(2) diff --git a/Zend/tests/dynamic_call_008.phpt b/Zend/tests/dynamic_call_008.phpt index 24240472d1..1916bcf913 100644 --- a/Zend/tests/dynamic_call_008.phpt +++ b/Zend/tests/dynamic_call_008.phpt @@ -4,10 +4,14 @@ Don't optimize dynamic call to non-dynamic one if it drops the warning 42]); + try { + ((string) 'extract')(['a' => 42]); + } catch (\Error $e) { + echo $e->getMessage() . "\n"; + } } test(); ?> ---EXPECTF-- -Warning: Cannot call extract() dynamically in %s on line %d +--EXPECT-- +Cannot call extract() dynamically diff --git a/Zend/zend_API.h b/Zend/zend_API.h index ce641dff39..5cdba4450b 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -538,7 +538,7 @@ static zend_always_inline int zend_forbid_dynamic_call(const char *func_name) ZEND_ASSERT(ex != NULL && ex->func != NULL); if (ZEND_CALL_INFO(ex) & ZEND_CALL_DYNAMIC) { - zend_error(E_WARNING, "Cannot call %s dynamically", func_name); + zend_throw_error(NULL, "Cannot call %s dynamically", func_name); return FAILURE; } diff --git a/ext/standard/tests/array/bug71220.phpt b/ext/standard/tests/array/bug71220.phpt index 49e5bb7719..ed46b25e18 100644 --- a/ext/standard/tests/array/bug71220.phpt +++ b/ext/standard/tests/array/bug71220.phpt @@ -3,8 +3,14 @@ Bug #71220 (Null pointer deref (segfault) in compact via ob_start) --FILE-- getMessage(); +} ?> -okey + +OKAY --EXPECT-- -okey +Cannot call compact() dynamically +OKAY -- 2.50.1