mirror of
https://github.com/php/php-src.git
synced 2024-09-23 10:57:26 +00:00
fix #40191 (use of array_unique() with objects triggers segfault)
This commit is contained in:
parent
d8c26fd461
commit
d181d3a0b3
@ -2846,7 +2846,7 @@ PHP_FUNCTION(array_change_key_case)
|
||||
Removes duplicate values from array */
|
||||
PHP_FUNCTION(array_unique)
|
||||
{
|
||||
zval *array;
|
||||
zval **array, *tmp;
|
||||
HashTable *target_hash;
|
||||
Bucket *p;
|
||||
struct bucketindex {
|
||||
@ -2856,14 +2856,18 @@ PHP_FUNCTION(array_unique)
|
||||
struct bucketindex *arTmp, *cmpdata, *lastkept;
|
||||
unsigned int i;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &array) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &array) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
target_hash = HASH_OF(array);
|
||||
target_hash = HASH_OF(*array);
|
||||
if (!target_hash) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The argument should be an array");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
/* copy the argument array */
|
||||
RETVAL_ZVAL(array, 1, 0);
|
||||
array_init(return_value);
|
||||
zend_hash_copy(Z_ARRVAL_P(return_value), target_hash, (copy_ctor_func_t) zval_add_ref, (void *)&tmp, sizeof(zval*));
|
||||
|
||||
if (target_hash->nNumOfElements <= 1) { /* nothing to do */
|
||||
return;
|
||||
|
31
ext/standard/tests/array/bug40191.phpt
Normal file
31
ext/standard/tests/array/bug40191.phpt
Normal file
@ -0,0 +1,31 @@
|
||||
--TEST--
|
||||
Bug #40191 (use of array_unique() with objects triggers segfault)
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
$arrObj = new ArrayObject();
|
||||
$arrObj->append('foo');
|
||||
$arrObj->append('bar');
|
||||
$arrObj->append('foo');
|
||||
|
||||
$arr = array_unique($arrObj);
|
||||
var_dump($arr);
|
||||
|
||||
echo "Done\n";
|
||||
?>
|
||||
--EXPECTF--
|
||||
array(2) {
|
||||
[0]=>
|
||||
string(3) "foo"
|
||||
[1]=>
|
||||
string(3) "bar"
|
||||
}
|
||||
Done
|
||||
--UEXPECTF--
|
||||
array(2) {
|
||||
[0]=>
|
||||
unicode(3) "foo"
|
||||
[1]=>
|
||||
unicode(3) "bar"
|
||||
}
|
||||
Done
|
Loading…
Reference in New Issue
Block a user