diff options
| author | Antony Dovgal <tony2001@php.net> | 2007-01-22 08:17:26 +0000 | 
|---|---|---|
| committer | Antony Dovgal <tony2001@php.net> | 2007-01-22 08:17:26 +0000 | 
| commit | 2c36778e47b6a14156da7a7a8b665637f12b1d3d (patch) | |
| tree | 0e104d3323151bb0f2bb63bb2990acb8640fa861 /ext | |
| parent | 8ddcd35d171d0ea436803fa3094dbd9743389a93 (diff) | |
| download | php-git-2c36778e47b6a14156da7a7a8b665637f12b1d3d.tar.gz | |
MFH: fix #40191 (use of array_unique() with objects triggers segfault)
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/standard/array.c | 6 | ||||
| -rw-r--r-- | ext/standard/tests/array/bug40191.phpt | 23 | 
2 files changed, 26 insertions, 3 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c index a159c2ae38..be3e73c191 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2792,7 +2792,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 { @@ -2811,8 +2811,8 @@ PHP_FUNCTION(array_unique)  		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; diff --git a/ext/standard/tests/array/bug40191.phpt b/ext/standard/tests/array/bug40191.phpt new file mode 100644 index 0000000000..8a68294faf --- /dev/null +++ b/ext/standard/tests/array/bug40191.phpt @@ -0,0 +1,23 @@ +--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  | 
