summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorAntony Dovgal <tony2001@php.net>2007-01-22 08:17:26 +0000
committerAntony Dovgal <tony2001@php.net>2007-01-22 08:17:26 +0000
commit2c36778e47b6a14156da7a7a8b665637f12b1d3d (patch)
tree0e104d3323151bb0f2bb63bb2990acb8640fa861 /ext
parent8ddcd35d171d0ea436803fa3094dbd9743389a93 (diff)
downloadphp-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.c6
-rw-r--r--ext/standard/tests/array/bug40191.phpt23
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