Skip to content

Commit 20edea5

Browse files
Girgiaskrakjoe
authored andcommitted
Promote warnings to errors in array_merge(_recursive)() and array_replace()
1 parent 3da3b4c commit 20edea5

File tree

5 files changed

+36
-29
lines changed

5 files changed

+36
-29
lines changed

ext/standard/array.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3577,7 +3577,7 @@ PHPAPI int php_array_merge_recursive(HashTable *dest, HashTable *src) /* {{{ */
35773577
ZVAL_DEREF(dest_zval);
35783578
thash = Z_TYPE_P(dest_zval) == IS_ARRAY ? Z_ARRVAL_P(dest_zval) : NULL;
35793579
if ((thash && GC_IS_RECURSIVE(thash)) || (src_entry == dest_entry && Z_ISREF_P(dest_entry) && (Z_REFCOUNT_P(dest_entry) % 2))) {
3580-
php_error_docref(NULL, E_WARNING, "recursion detected");
3580+
zend_throw_error(NULL, "Recursion detected");
35813581
return 0;
35823582
}
35833583

@@ -3698,7 +3698,7 @@ PHPAPI int php_array_replace_recursive(HashTable *dest, HashTable *src) /* {{{ *
36983698
if (Z_IS_RECURSIVE_P(dest_zval) ||
36993699
Z_IS_RECURSIVE_P(src_zval) ||
37003700
(Z_ISREF_P(src_entry) && Z_ISREF_P(dest_entry) && Z_REF_P(src_entry) == Z_REF_P(dest_entry) && (Z_REFCOUNT_P(dest_entry) % 2))) {
3701-
php_error_docref(NULL, E_WARNING, "recursion detected");
3701+
zend_throw_error(NULL, "Recursion detected");
37023702
return 0;
37033703
}
37043704

ext/standard/tests/array/array_replace.phpt

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,15 @@ $data = array_replace_recursive($array1, $array2);
4242
var_dump($data);
4343

4444
echo " -- Testing array_replace_recursive() w/ endless recusrsion --\n";
45-
$data = array_replace_recursive($array3, $array4);
45+
try {
46+
$data = array_replace_recursive($array3, $array4);
47+
var_dump($data);
48+
} catch (\Error $e) {
49+
echo $e->getMessage() . "\n";
50+
}
4651

47-
var_dump($data);
4852
?>
49-
--EXPECTF--
53+
--EXPECT--
5054
-- Testing array_replace() --
5155
array(5) {
5256
[0]=>
@@ -107,16 +111,4 @@ array(5) {
107111
}
108112
}
109113
-- Testing array_replace_recursive() w/ endless recusrsion --
110-
111-
Warning: array_replace_recursive(): recursion detected in %s on line %d
112-
array(1) {
113-
[0]=>
114-
array(1) {
115-
[0]=>
116-
array(1) {
117-
[0]=>
118-
array(0) {
119-
}
120-
}
121-
}
122-
}
114+
Recursion detected

ext/standard/tests/array/bug42177.phpt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ unset( $a1, $a2 );
1818
$a1 = array();
1919
$a2 = array( 'key1' => &$a1 );
2020
$a1 = array_merge_recursive( $a1, $a2 );
21-
$a1 = array_merge_recursive( $a1, $a2 );
21+
try {
22+
$a1 = array_merge_recursive( $a1, $a2 );
23+
} catch (\Error $e) {
24+
echo $e->getMessage() . " on line " . $e->getLine() . "\n";
25+
}
2226
unset( $a1, $a2 );
2327

2428
$x = 'foo';
@@ -30,5 +34,5 @@ $a1 = array_merge_recursive( $a1, $a2 );
3034
unset( $a1, $a2 );
3135

3236
?>
33-
--EXPECTF--
34-
Warning: array_merge_recursive(): recursion detected in %s on line 18
37+
--EXPECT--
38+
Recursion detected on line 19

ext/standard/tests/array/bug43495.phpt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,21 @@ $a["key1"]["key2"]["key3"]=&$a;
88
$b=array("key1"=>array("key2"=>array()));
99
$b["key1"]["key2"]["key3"]=&$b;
1010

11-
array_merge_recursive($a,$b);
11+
12+
try {
13+
array_merge_recursive($a,$b);
14+
} catch (\Error $e) {
15+
echo $e->getMessage() . "\n";
16+
}
1217

1318
/* Break recursion */
1419
$a["key1"]["key2"]["key3"] = null;
1520
$b["key1"]["key2"]["key3"] = null;
1621

17-
echo "Done.\n";
1822
?>
19-
--EXPECTF--
20-
Warning: array_merge_recursive(): recursion detected in %sbug43495.php on line %d
21-
Done.
23+
24+
DONE
25+
--EXPECT--
26+
Recursion detected
27+
28+
DONE

ext/standard/tests/array/bug65251.phpt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@ Bug #65251: array_merge_recursive() recursion detection broken
33
--FILE--
44
<?php
55

6-
array_merge_recursive($GLOBALS, $GLOBALS)
6+
try {
7+
array_merge_recursive($GLOBALS, $GLOBALS);
8+
} catch (\Error $e) {
9+
echo $e->getMessage() . "\n";
10+
}
711

812
?>
9-
--EXPECTF--
10-
Warning: array_merge_recursive(): recursion detected in %s on line %d
13+
--EXPECT--
14+
Recursion detected

0 commit comments

Comments
 (0)