Skip to content

Commit 675e975

Browse files
committed
Promote warning to error in zend_forbid_dynamic_call()
1 parent 1059e3d commit 675e975

File tree

8 files changed

+110
-61
lines changed

8 files changed

+110
-61
lines changed

Zend/tests/bug71221.phpt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@ Bug #71221 (Null pointer deref (segfault) in get_defined_vars via ob_start)
33
--FILE--
44
<?php
55
ob_start("get_defined_vars");
6-
ob_end_clean();
6+
try {
7+
ob_end_clean();
8+
} catch (\Error $e) {
9+
echo $e->getMessage();
10+
}
711
?>
8-
okey
12+
13+
OKAY
914
--EXPECT--
10-
okey
15+
Cannot call get_defined_vars() dynamically
16+
OKAY

Zend/tests/bug72107.phpt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ set_error_handler('func_get_args');
66
function test($a) {
77
echo $undef;
88
}
9-
test(1);
9+
try {
10+
test(1);
11+
} catch (\Error $e) {
12+
echo $e->getMessage();
13+
}
1014
?>
11-
--EXPECTF--
12-
Warning: Cannot call func_get_args() dynamically in %s on line %d
13-
14-
Notice: Undefined variable: undef in %s on line %d
15+
--EXPECT--
16+
Cannot call func_get_args() dynamically

Zend/tests/dynamic_call_005.phpt

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,31 @@ Dynamic calls to scope introspection functions are forbidden
66
function test_calls($func) {
77
$i = 1;
88

9-
array_map($func, [['i' => new stdClass]]);
10-
var_dump($i);
9+
try {
10+
array_map($func, [['i' => new stdClass]]);
11+
var_dump($i);
12+
} catch (\Error $e) {
13+
echo $e->getMessage() . "\n";
14+
}
1115

12-
$func(['i' => new stdClass]);
13-
var_dump($i);
16+
try {
17+
$func(['i' => new stdClass]);
18+
var_dump($i);
19+
} catch (\Error $e) {
20+
echo $e->getMessage() . "\n";
21+
}
1422

15-
call_user_func($func, ['i' => new stdClass]);
16-
var_dump($i);
23+
try {
24+
call_user_func($func, ['i' => new stdClass]);
25+
var_dump($i);
26+
} catch (\Error $e) {
27+
echo $e->getMessage() . "\n";
28+
}
1729
}
1830
test_calls('extract');
1931

2032
?>
21-
--EXPECTF--
22-
Warning: Cannot call extract() dynamically in %s on line %d
23-
int(1)
24-
25-
Warning: Cannot call extract() dynamically in %s on line %d
26-
int(1)
27-
28-
Warning: Cannot call extract() dynamically in %s on line %d
29-
int(1)
33+
--EXPECT--
34+
Cannot call extract() dynamically
35+
Cannot call extract() dynamically
36+
Cannot call extract() dynamically

Zend/tests/dynamic_call_006.phpt

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,56 @@ Dynamic calls to scope introspection functions are forbidden (function variation
33
--FILE--
44
<?php
55
function test() {
6-
$func = 'extract';
7-
$func(['a' => 'b']);
86

9-
$func = 'compact';
10-
$func(['a']);
11-
12-
$func = 'get_defined_vars';
13-
$func();
14-
15-
$func = 'func_get_args';
16-
$func();
17-
18-
$func = 'func_get_arg';
19-
$func(1);
20-
21-
$func = 'func_num_args';
22-
$func();
7+
try {
8+
$func = 'extract';
9+
$func(['a' => 'b']);
10+
} catch (\Error $e) {
11+
echo $e->getMessage() . "\n";
12+
}
13+
14+
try {
15+
$func = 'compact';
16+
$func(['a']);
17+
} catch (\Error $e) {
18+
echo $e->getMessage() . "\n";
19+
}
20+
21+
try {
22+
$func = 'get_defined_vars';
23+
$func();
24+
} catch (\Error $e) {
25+
echo $e->getMessage() . "\n";
26+
}
27+
28+
try {
29+
$func = 'func_get_args';
30+
$func();
31+
} catch (\Error $e) {
32+
echo $e->getMessage() . "\n";
33+
}
34+
35+
try {
36+
$func = 'func_get_arg';
37+
$func(1);
38+
} catch (\Error $e) {
39+
echo $e->getMessage() . "\n";
40+
}
41+
42+
try {
43+
$func = 'func_num_args';
44+
$func();
45+
} catch (\Error $e) {
46+
echo $e->getMessage() . "\n";
47+
}
2348
}
2449
test();
2550

2651
?>
27-
--EXPECTF--
28-
Warning: Cannot call extract() dynamically in %s on line %d
29-
30-
Warning: Cannot call compact() dynamically in %s on line %d
31-
32-
Warning: Cannot call get_defined_vars() dynamically in %s on line %d
33-
34-
Warning: Cannot call func_get_args() dynamically in %s on line %d
35-
36-
Warning: Cannot call func_get_arg() dynamically in %s on line %d
37-
38-
Warning: Cannot call func_num_args() dynamically in %s on line %d
52+
--EXPECT--
53+
Cannot call extract() dynamically
54+
Cannot call compact() dynamically
55+
Cannot call get_defined_vars() dynamically
56+
Cannot call func_get_args() dynamically
57+
Cannot call func_get_arg() dynamically
58+
Cannot call func_num_args() dynamically

Zend/tests/dynamic_call_007.phpt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@ Dynamic calls to scope introspection functions are forbidden (misoptimization)
55

66
function test() {
77
$i = 1;
8-
array_map('extract', [['i' => new stdClass]]);
8+
try {
9+
array_map('extract', [['i' => new stdClass]]);
10+
} catch (\Error $e) {
11+
echo $e->getMessage() . "\n";
12+
}
913
$i += 1;
1014
var_dump($i);
1115
}
1216
test();
1317

1418
?>
15-
--EXPECTF--
16-
Warning: Cannot call extract() dynamically in %s on line %d
19+
--EXPECT--
20+
Cannot call extract() dynamically
1721
int(2)

Zend/tests/dynamic_call_008.phpt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ Don't optimize dynamic call to non-dynamic one if it drops the warning
44
<?php
55

66
function test() {
7-
((string) 'extract')(['a' => 42]);
7+
try {
8+
((string) 'extract')(['a' => 42]);
9+
} catch (\Error $e) {
10+
echo $e->getMessage() . "\n";
11+
}
812
}
913
test();
1014

1115
?>
12-
--EXPECTF--
13-
Warning: Cannot call extract() dynamically in %s on line %d
16+
--EXPECT--
17+
Cannot call extract() dynamically

Zend/zend_API.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ static zend_always_inline int zend_forbid_dynamic_call(const char *func_name)
538538
ZEND_ASSERT(ex != NULL && ex->func != NULL);
539539

540540
if (ZEND_CALL_INFO(ex) & ZEND_CALL_DYNAMIC) {
541-
zend_error(E_WARNING, "Cannot call %s dynamically", func_name);
541+
zend_throw_error(NULL, "Cannot call %s dynamically", func_name);
542542
return FAILURE;
543543
}
544544

ext/standard/tests/array/bug71220.phpt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@ Bug #71220 (Null pointer deref (segfault) in compact via ob_start)
33
--FILE--
44
<?php
55
ob_start("compact");
6-
ob_end_clean();
6+
try {
7+
ob_end_clean();
8+
} catch (\Error $e) {
9+
echo $e->getMessage();
10+
}
711
?>
8-
okey
12+
13+
OKAY
914
--EXPECT--
10-
okey
15+
Cannot call compact() dynamically
16+
OKAY

0 commit comments

Comments
 (0)