]> granicus.if.org Git - php/commitdiff
Fixed bug #26675 (Segfault on ArrayAccess use)
authorMarcus Boerger <helly@php.net>
Mon, 22 Dec 2003 16:27:14 +0000 (16:27 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 22 Dec 2003 16:27:14 +0000 (16:27 +0000)
Update NEWS

NEWS
Zend/zend_object_handlers.c
tests/classes/array_access_007.phpt [new file with mode: 0755]

diff --git a/NEWS b/NEWS
index 9545fa00ebf6e317e3c8403f93a354bc26c57d6f..b873c82e3f7711aabc974de73c3c8aa9c9391a3f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+?? ??? 2004, PHP 5 RC 1
+- Fixed bug #26675 (Segfault on ArrayAccess use). (Marcus)
+
 21 Dec 2003, PHP 5 Beta 3
 - Bundled new tidy extension (John, Wez)
 - Upgraded PCRE library to version 4.5. (Andrei)
index bc4bf48535f084cfb5643cdb9fbbeb7b51d822e2..fdf3d2bc5e9236ae2163cc22684d1c1c4b178c29 100644 (file)
@@ -400,8 +400,13 @@ zval *zend_std_read_dimension(zval *object, zval *offset TSRMLS_DC)
 static void zend_std_write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC)
 {
        zend_class_entry *ce = Z_OBJCE_P(object);
+       zval tmp;
        
        if (instanceof_function_ex(ce, zend_ce_arrayaccess, 1 TSRMLS_CC)) {
+               if (!offset) {
+                       INIT_ZVAL(tmp);
+                       offset = &tmp;
+               }
                zend_call_method_with_2_params(&object, ce, NULL, "offsetset", NULL, offset, value);
        } else {
                zend_error(E_ERROR, "Cannot use object of type %s as array", ce->name);
diff --git a/tests/classes/array_access_007.phpt b/tests/classes/array_access_007.phpt
new file mode 100755 (executable)
index 0000000..42187fe
--- /dev/null
@@ -0,0 +1,57 @@
+--TEST--
+ZE2 ArrayAccess and [] assignment
+--FILE--
+<?php 
+
+class OverloadedArray implements ArrayAccess {
+       public $realArray;
+       
+       function __construct() {
+               $this->realArray = array();
+       }
+
+       function offsetExists($index) {
+               return array_key_exists($this->realArray, $index);
+       }
+
+       function offsetGet($index) {
+               return $this->realArray[$index];
+       }
+
+       function offsetSet($index, $value) {
+               if (is_null($index)) {
+                       $this->realArray[] = $value;
+               } else {
+                       $this->realArray[$index] = $value;
+               }
+       }
+
+       function offsetUnset($index) {
+               unset($this->realArray[$index]);
+       }
+
+       function dump() {
+               var_dump($this->realArray);
+       }
+}
+
+$a = new OverloadedArray;
+$a[] = 1;
+$a[1] = 2;
+$a[2] = 3;
+$a[] = 4;
+$a->dump();
+?>
+===DONE===
+--EXPECT--
+array(4) {
+  [0]=>
+  int(1)
+  [1]=>
+  int(2)
+  [2]=>
+  int(3)
+  [3]=>
+  int(4)
+}
+===DONE===