From cf624412621da439e8b7efd9a0df58f701d04672 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 21 Aug 2019 19:35:35 +0200 Subject: [PATCH 1/4] Promote warning to error in zend_forbid_dynamic_call() --- Zend/zend_API.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index ce641dff39f4e..5cdba4450b5d6 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; } From 53d9fea792a643fcc89802c8911c1d190b34a034 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 21 Aug 2019 20:42:37 +0200 Subject: [PATCH 2/4] Possible test fixes --- Zend/tests/bug71221.phpt | 12 +++- Zend/tests/bug72107.phpt | 9 ++- 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 +++- ext/standard/tests/array/bug71220.phpt | 12 +++- 7 files changed, 108 insertions(+), 58 deletions(-) diff --git a/Zend/tests/bug71221.phpt b/Zend/tests/bug71221.phpt index 0f6ee16946232..ac846dfa514d9 100644 --- a/Zend/tests/bug71221.phpt +++ b/Zend/tests/bug71221.phpt @@ -2,9 +2,15 @@ Bug #71221 (Null pointer deref (segfault) in get_defined_vars via ob_start) --FILE-- getMessage(); +} ob_end_clean(); ?> -okey + +OKAY --EXPECT-- -okey +Cannot call get_defined_vars() dynamically +OKAY diff --git a/Zend/tests/bug72107.phpt b/Zend/tests/bug72107.phpt index 3f4c46cf70c7a..bc86c860b1249 100644 --- a/Zend/tests/bug72107.phpt +++ b/Zend/tests/bug72107.phpt @@ -2,13 +2,16 @@ Bug #72107: Segfault when using func_get_args as error handler --FILE-- getMessage(); +} function test($a) { echo $undef; } test(1); ?> --EXPECTF-- -Warning: Cannot call func_get_args() dynamically in %s on line %d - +Cannot call func_get_args() dynamically Notice: Undefined variable: undef in %s on line %d diff --git a/Zend/tests/dynamic_call_005.phpt b/Zend/tests/dynamic_call_005.phpt index 840e298b826a3..91d1cb914c12d 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 7a2872bccac34..e6ea719158543 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 61ae18291418f..f1312b95b47a3 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 24240472d16ef..1916bcf91345c 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/ext/standard/tests/array/bug71220.phpt b/ext/standard/tests/array/bug71220.phpt index 49e5bb7719241..ed46b25e186d0 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 From 11d93f965c85c97bf2939f71796c2bcfb8e894a0 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 21 Aug 2019 21:22:20 +0200 Subject: [PATCH 3/4] Another fix test ? --- Zend/tests/bug71221.phpt | 6 +++--- Zend/tests/bug72107.phpt | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Zend/tests/bug71221.phpt b/Zend/tests/bug71221.phpt index ac846dfa514d9..1740eb0114d40 100644 --- a/Zend/tests/bug71221.phpt +++ b/Zend/tests/bug71221.phpt @@ -2,15 +2,15 @@ Bug #71221 (Null pointer deref (segfault) in get_defined_vars via ob_start) --FILE-- getMessage(); } -ob_end_clean(); ?> OKAY --EXPECT-- -Cannot call get_defined_vars() dynamically + OKAY diff --git a/Zend/tests/bug72107.phpt b/Zend/tests/bug72107.phpt index bc86c860b1249..15a390bd1bad9 100644 --- a/Zend/tests/bug72107.phpt +++ b/Zend/tests/bug72107.phpt @@ -2,15 +2,15 @@ Bug #72107: Segfault when using func_get_args as error handler --FILE-- getMessage(); } -function test($a) { - echo $undef; -} -test(1); ?> --EXPECTF-- Cannot call func_get_args() dynamically From 36e0ef6d4969e5f6af8833353fddda6bcf165787 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 21 Aug 2019 21:41:37 +0200 Subject: [PATCH 4/4] Actual test fix --- Zend/tests/bug71221.phpt | 2 +- Zend/tests/bug72107.phpt | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Zend/tests/bug71221.phpt b/Zend/tests/bug71221.phpt index 1740eb0114d40..eeba6450ab90f 100644 --- a/Zend/tests/bug71221.phpt +++ b/Zend/tests/bug71221.phpt @@ -12,5 +12,5 @@ try { OKAY --EXPECT-- - +Cannot call get_defined_vars() dynamically OKAY diff --git a/Zend/tests/bug72107.phpt b/Zend/tests/bug72107.phpt index 15a390bd1bad9..c22f657ebbca1 100644 --- a/Zend/tests/bug72107.phpt +++ b/Zend/tests/bug72107.phpt @@ -12,6 +12,5 @@ try { echo $e->getMessage(); } ?> ---EXPECTF-- +--EXPECT-- Cannot call func_get_args() dynamically -Notice: Undefined variable: undef in %s on line %d