Hi Dmitry!
(moved to internal@)

On 11/8/06, Dmitry Stogov <[EMAIL PROTECTED]> wrote:
Hi,

Please pay attention to this patch.
It makes overloaded arrays behave in exactly the same way as overloaded
objects.
It disables indirect modification of overloaded arrays and emits notices.
It doesn't behave _exactly_ the same way...

<?php
class foo implements ArrayAccess{
public $bar;
public function __get($var) {
   return $this->bar;
}
public function offsetGet($var) {
   return $this->bar;
}
public function offsetSet($var, $val) {}
public function offsetExists($offset) {}
public function offsetUnset($var) {}
}

$foo = new foo;
$bar =& $foo->prop;
$bar =& $foo["prop"];
PHP Notice:  Indirect modification of overloaded property foo::$prop
has no effect in /usr/src/php/5.2/- on line 16
PHP Notice:  Indirect modification of overloaded element of foo has no
effect in /usr/src/php/5.2/- on line 17
PHP Fatal error:  Objects used as arrays in post/pre
increment/decrement must return values by reference in
/usr/src/php/5.2/- on line 17

But I guess this is expected behavior?

-Hannes

The patch breaks (adds notice) three tests:

test/classes/array_acess_005.phpt
test/classes/array_acess_008.phpt
test/classes/array_acess_012.phpt

Thanks. Dmitry.

> -----Original Message-----
> From: Dmitry Stogov [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, November 08, 2006 4:38 PM
> To: [EMAIL PROTECTED]
> Subject: [ZEND-ENGINE-CVS] cvs: ZendEngine2(PHP_5_2) /
> zend_object_handlers.c /tests bug39297.phpt php-src NEWS
>
>
> dmitry                Wed Nov  8 13:38:29 2006 UTC
>
>   Added files:                 (Branch: PHP_5_2)
>     /ZendEngine2/tests        bug39297.phpt
>
>   Modified files:
>     /php-src  NEWS
>     /ZendEngine2      zend_object_handlers.c
>   Log:
>   Fixed bug #39297 (Memory corryption because of indirect
> modification of overloaded array).
>
>
> http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.3
> 39&r2=1.2027.2.547.2.340&diff_format=u
> Index: php-src/NEWS
> diff -u php-src/NEWS:1.2027.2.547.2.339
> php-src/NEWS:1.2027.2.547.2.340
> --- php-src/NEWS:1.2027.2.547.2.339   Wed Nov  8 11:04:27 2006
> +++ php-src/NEWS      Wed Nov  8 13:38:28 2006
> @@ -30,6 +30,8 @@
>    an extension INI directive). (wharmby at uk dot ibm dot
> com, Dmitry)
>  - Fixed bug #39320 (ZEND_HASH_APPLY_STOP causes deletion). (Marcus)
>  - Fixed bug #39313 (spl_autoload triggers Fatal error). (Marcus)
> +- Fixed bug #39297 (Memory corryption because of indirect
> modification
> +  of overloaded array). (Dmitry)
>  - Fixed bug #39265 (Fixed path handling inside mod_files.sh).
>    (michal dot taborsky at gmail dot com, Ilia)
>  - Fixed bug #39215 (Inappropriate close of
> stdin/stdout/stderr). (Wez,Ilia)
> http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_object_handlers
> .c?r1=1.135.2.6.2.15&r2=1.135.2.6.2.16&diff_format=u
> Index: ZendEngine2/zend_object_handlers.c
> diff -u ZendEngine2/zend_object_handlers.c:1.135.2.6.2.15
> ZendEngine2/zend_object_handlers.c:1.135.2.6.2.16
> --- ZendEngine2/zend_object_handlers.c:1.135.2.6.2.15 Tue Sep
> 12 11:01:16 2006
> +++ ZendEngine2/zend_object_handlers.c        Wed Nov  8 13:38:28 2006
> @@ -17,7 +17,7 @@
>
> +-------------------------------------------------------------
> ---------+
>  */
>
> -/* $Id: zend_object_handlers.c,v 1.135.2.6.2.15 2006/09/12
> 11:01:16 dmitry Exp $ */
> +/* $Id: zend_object_handlers.c,v 1.135.2.6.2.16 2006/11/08 13:38:28
> +dmitry Exp $ */
>
>  #include "zend.h"
>  #include "zend_globals.h"
> @@ -469,6 +469,19 @@
>               /* Undo PZVAL_LOCK() */
>               retval->refcount--;
>
> +             if ((type == BP_VAR_W || type == BP_VAR_RW  ||
> type == BP_VAR_UNSET) && retval->refcount > 0) {
> +                     zval *tmp = retval;
> +
> +                     ALLOC_ZVAL(retval);
> +                     *retval = *tmp;
> +                     zval_copy_ctor(retval);
> +                     retval->is_ref = 0;
> +                     retval->refcount = 0;
> +                     if (Z_TYPE_P(retval) != IS_OBJECT) {
> +                             zend_error(E_NOTICE, "Indirect
> modification of overloaded element of %s has no effect", ce->name);
> +                     }
> +             }
> +
>               return retval;
>       } else {
>               zend_error(E_ERROR, "Cannot use object of type
> %s as array", ce->name);
>
> http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug39297.phpt?
view=markup&rev=1.1
Index: ZendEngine2/tests/bug39297.phpt
+++ ZendEngine2/tests/bug39297.phpt

--
Zend Engine CVS Mailing List (http://cvs.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

--
Zend Engine CVS Mailing List (http://cvs.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to