summaryrefslogtreecommitdiff
path: root/ext/standard
diff options
context:
space:
mode:
authorAntony Dovgal <tony2001@php.net>2006-11-22 10:42:41 +0000
committerAntony Dovgal <tony2001@php.net>2006-11-22 10:42:41 +0000
commitdf1a1c84412b28323a3818f1a5bed931491bddb3 (patch)
tree30c230c3d7d6b841f9163ef11b8cb3825e87044d /ext/standard
parent090a83b9744ab66a9131ba634c006ed0cc104203 (diff)
downloadphp-git-df1a1c84412b28323a3818f1a5bed931491bddb3.tar.gz
MFH: fix #39576 (array_walk() doesn't separate userdata zval)
Diffstat (limited to 'ext/standard')
-rw-r--r--ext/standard/array.c4
-rw-r--r--ext/standard/tests/array/bug39576.phpt52
2 files changed, 54 insertions, 2 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 45774fe2aa..128935e551 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -1138,7 +1138,7 @@ PHP_FUNCTION(array_walk)
HashTable *target_hash;
old_walk_func_name = BG(array_walk_func_name);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz|z", &array, &tmp, &userdata) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz/|z/", &array, &tmp, &userdata) == FAILURE) {
return;
}
target_hash = HASH_OF(array);
@@ -1169,7 +1169,7 @@ PHP_FUNCTION(array_walk_recursive)
HashTable *target_hash;
old_walk_func_name = BG(array_walk_func_name);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz|z", &array, &tmp, &userdata) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz/|z/", &array, &tmp, &userdata) == FAILURE) {
return;
}
target_hash = HASH_OF(array);
diff --git a/ext/standard/tests/array/bug39576.phpt b/ext/standard/tests/array/bug39576.phpt
new file mode 100644
index 0000000000..7c8aeef175
--- /dev/null
+++ b/ext/standard/tests/array/bug39576.phpt
@@ -0,0 +1,52 @@
+--TEST--
+Bug #39576 (array_walk() doesn't separate userdata zval)
+--FILE--
+<?php
+
+class Test {
+
+ public $_table = '';
+ public $_columns = array ();
+ public $_primary = array ();
+
+}
+
+$test = new Test ();
+$test->name = 'test';
+$test->_columns['name'] = new stdClass;
+
+function test ($value, $column, &$columns) {}
+
+array_walk (
+ get_object_vars ($test),
+ 'test',
+ $test->_columns
+);
+
+var_dump($test);
+
+array_intersect_key (
+ get_object_vars ($test),
+ $test->_primary
+);
+
+echo "Done\n";
+?>
+--EXPECTF--
+Strict Standards: Only variables should be passed by reference in %s on line %d
+object(Test)#%d (4) {
+ ["_table"]=>
+ string(0) ""
+ ["_columns"]=>
+ array(1) {
+ ["name"]=>
+ object(stdClass)#%d (0) {
+ }
+ }
+ ["_primary"]=>
+ array(0) {
+ }
+ ["name"]=>
+ string(4) "test"
+}
+Done