Skip to content

Commit

Permalink
Merge branch 'PHP-8.4'
Browse files Browse the repository at this point in the history
* PHP-8.4:
  Fix GH-16957: Assertion failure in array_shift with self-referencing array
  • Loading branch information
nielsdos committed Nov 29, 2024
2 parents f8547b1 + ab7c3b1 commit 563da1b
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 2 deletions.
10 changes: 8 additions & 2 deletions ext/standard/array.c
Original file line number Diff line number Diff line change
Expand Up @@ -3632,7 +3632,8 @@ PHP_FUNCTION(array_shift)
}
idx++;
}
RETVAL_COPY_DEREF(val);
RETVAL_COPY_VALUE(val);
ZVAL_UNDEF(val);

/* Delete the first value */
zend_hash_packed_del_val(Z_ARRVAL_P(stack), val);
Expand Down Expand Up @@ -3686,7 +3687,8 @@ PHP_FUNCTION(array_shift)
}
idx++;
}
RETVAL_COPY_DEREF(val);
RETVAL_COPY_VALUE(val);
ZVAL_UNDEF(val);

/* Delete the first value */
zend_hash_del_bucket(Z_ARRVAL_P(stack), p);
Expand All @@ -3710,6 +3712,10 @@ PHP_FUNCTION(array_shift)
}

zend_hash_internal_pointer_reset(Z_ARRVAL_P(stack));

if (Z_ISREF_P(return_value)) {
zend_unwrap_reference(return_value);
}
}
/* }}} */

Expand Down
41 changes: 41 additions & 0 deletions ext/standard/tests/array/gh16957.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
--TEST--
GH-16957 (Assertion failure in array_shift with self-referencing array)
--FILE--
<?php
$new_array = array(&$new_array, 1, 'two');
var_dump($shifted = array_shift($new_array));
var_dump($new_array);
var_dump($new_array === $shifted);

$new_array2 = array(&$new_array2, 2 => 1, 300 => 'two');
var_dump($shifted = array_shift($new_array2));
var_dump($new_array2);
var_dump($new_array2 === $shifted);
?>
--EXPECT--
array(2) {
[0]=>
int(1)
[1]=>
string(3) "two"
}
array(2) {
[0]=>
int(1)
[1]=>
string(3) "two"
}
bool(true)
array(2) {
[0]=>
int(1)
[1]=>
string(3) "two"
}
array(2) {
[0]=>
int(1)
[1]=>
string(3) "two"
}
bool(true)

0 comments on commit 563da1b

Please sign in to comment.