summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rwxr-xr-xZend/tests/bug38146.phpt3
-rwxr-xr-xZend/tests/bug39775.phpt20
-rw-r--r--Zend/zend_execute.c23
-rw-r--r--Zend/zend_object_handlers.c31
-rw-r--r--ext/spl/tests/iterator_035.phpt2
-rw-r--r--tests/classes/array_access_003.phpt5
-rw-r--r--tests/classes/array_access_004.phpt5
-rwxr-xr-xtests/classes/array_access_005.phpt5
-rwxr-xr-xtests/classes/array_access_008.phpt8
-rwxr-xr-xtests/classes/array_access_012.phpt2
11 files changed, 69 insertions, 36 deletions
diff --git a/NEWS b/NEWS
index bcc23235d3..7735cf4b82 100644
--- a/NEWS
+++ b/NEWS
@@ -49,6 +49,7 @@ PHP NEWS
- Fixed FastCGI impersonation for persistent connections on Windows. (Dmitry)
- Fixed wrong signature initialization in imagepng (Takeshi Abe)
- Added optimization for imageline with horizontal and vertial lines (Pierre)
+- Fixed bug #39775 ("Indirect modification ..." message is not shown). (Dmitry)
- Fixed bug #39763 (magic quotes are applied twice by ext/filter). (Tony)
- Fixed bug #39754 (Some POSIX extension functions not thread safe).
(Ilia, wharmby at uk dot ibm dot com)
diff --git a/Zend/tests/bug38146.phpt b/Zend/tests/bug38146.phpt
index e321e11c8c..04cb1fa8a0 100755
--- a/Zend/tests/bug38146.phpt
+++ b/Zend/tests/bug38146.phpt
@@ -14,6 +14,7 @@ foreach($f->bar as $key => $value) {
print "$key => $value\n";
}
?>
---EXPECT--
+--EXPECTF--
+Notice: Indirect modification of overloaded property foo::$bar has no effect in %sbug38146.php on line 10
foo => bar
bar => foo
diff --git a/Zend/tests/bug39775.phpt b/Zend/tests/bug39775.phpt
new file mode 100755
index 0000000000..4c6ce6baf1
--- /dev/null
+++ b/Zend/tests/bug39775.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #39775 ("Indirect modification ..." message is not shown)
+--FILE--
+<?php
+class test {
+ var $array = array();
+ function __get($var) {
+ $v =& $this->array;
+ return $this->array;
+ }
+}
+$t = new test;
+$t->anything[] = 'bar';
+print_r($t->anything);
+?>
+--EXPECTF--
+Notice: Indirect modification of overloaded property test::$anything has no effect in %sbug39775.php on line 10
+Array
+(
+)
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index c6ab1db9b9..59594713ff 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1162,16 +1162,21 @@ static void zend_fetch_dimension_address(temp_variable *result, zval **container
overloaded_result = Z_OBJ_HT_P(container)->read_dimension(container, dim, type TSRMLS_CC);
if (overloaded_result) {
- switch (type) {
- case BP_VAR_RW:
- case BP_VAR_W:
- if (Z_TYPE_P(overloaded_result) != IS_OBJECT
- && !overloaded_result->is_ref) {
- zend_error_noreturn(E_ERROR, "Objects used as arrays in post/pre increment/decrement must return values by reference");
- }
- break;
+ if (type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) {
+ if (overloaded_result->refcount > 0) {
+ zval *tmp = overloaded_result;
+
+ ALLOC_ZVAL(overloaded_result);
+ *overloaded_result = *tmp;
+ zval_copy_ctor(overloaded_result);
+ overloaded_result->is_ref = 0;
+ overloaded_result->refcount = 0;
+ }
+ if (Z_TYPE_P(overloaded_result) != IS_OBJECT) {
+ zend_class_entry *ce = Z_OBJCE_P(container);
+ zend_error(E_NOTICE, "Indirect modification of overloaded element of %s has no effect", ce->name);
+ }
}
-
retval = &overloaded_result;
} else {
retval = &EG(error_zval_ptr);
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 92e798c754..221035b8a5 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -334,14 +334,16 @@ zval *zend_std_read_property(zval *object, zval *member, int type TSRMLS_DC)
if (rv) {
retval = &rv;
- if ((type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) && rv->refcount > 0) {
- zval *tmp = rv;
-
- ALLOC_ZVAL(rv);
- *rv = *tmp;
- zval_copy_ctor(rv);
- rv->is_ref = 0;
- rv->refcount = 0;
+ if (type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) {
+ if (rv->refcount > 0) {
+ zval *tmp = rv;
+
+ ALLOC_ZVAL(rv);
+ *rv = *tmp;
+ zval_copy_ctor(rv);
+ rv->is_ref = 0;
+ rv->refcount = 0;
+ }
if (Z_TYPE_P(rv) != IS_OBJECT) {
zend_error(E_NOTICE, "Indirect modification of overloaded property %s::$%s has no effect", zobj->ce->name, Z_STRVAL_P(member));
}
@@ -469,19 +471,6 @@ zval *zend_std_read_dimension(zval *object, zval *offset, int type TSRMLS_DC)
/* 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);
diff --git a/ext/spl/tests/iterator_035.phpt b/ext/spl/tests/iterator_035.phpt
index 9dfe35d5f4..4fe70cb80c 100644
--- a/ext/spl/tests/iterator_035.phpt
+++ b/ext/spl/tests/iterator_035.phpt
@@ -14,4 +14,6 @@ $a[] = &$tmp;
echo "Done\n";
?>
--EXPECTF--
+Notice: Indirect modification of overloaded element of ArrayIterator has no effect in %siterator_035.php on line 7
+
Fatal error: Cannot assign by reference to overloaded object in %s on line %d
diff --git a/tests/classes/array_access_003.phpt b/tests/classes/array_access_003.phpt
index 2d42665fc6..3e631125e7 100644
--- a/tests/classes/array_access_003.phpt
+++ b/tests/classes/array_access_003.phpt
@@ -53,4 +53,7 @@ object::offsetGet(2)
int(1)
object::offsetGet(2)
-Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in %sarray_access_003.php on line %d
+Notice: Indirect modification of overloaded element of object has no effect in %sarray_access_003.php on line 39
+object::offsetGet(2)
+int(1)
+===DONE===
diff --git a/tests/classes/array_access_004.phpt b/tests/classes/array_access_004.phpt
index 17f5b7c404..787496707c 100644
--- a/tests/classes/array_access_004.phpt
+++ b/tests/classes/array_access_004.phpt
@@ -51,4 +51,7 @@ object::offsetGet(2)
int(1)
object::offsetGet(2)
-Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in %sarray_access_004.php on line %d
+Notice: Indirect modification of overloaded element of object has no effect in %sarray_access_004.php on line 39
+object::offsetGet(2)
+int(1)
+===DONE===
diff --git a/tests/classes/array_access_005.phpt b/tests/classes/array_access_005.phpt
index 3832c536f3..dcb873ff56 100755
--- a/tests/classes/array_access_005.phpt
+++ b/tests/classes/array_access_005.phpt
@@ -70,5 +70,8 @@ array(1) {
}
Notice: Indirect modification of overloaded element of Peoples has no effect in %sarray_access_005.php on line 46
+string(6) "JoeFoo"
-Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in %sarray_access_005.php on line %d
+Notice: Indirect modification of overloaded element of Peoples has no effect in %sarray_access_005.php on line 48
+string(6) "JoeFoo"
+===DONE===
diff --git a/tests/classes/array_access_008.phpt b/tests/classes/array_access_008.phpt
index 2b577c49e0..9979889174 100755
--- a/tests/classes/array_access_008.phpt
+++ b/tests/classes/array_access_008.phpt
@@ -57,5 +57,11 @@ string(9) "FooBarBaz"
string(3) "Foo"
Notice: Indirect modification of overloaded element of Peoples has no effect in %sarray_access_008.php on line 40
+string(3) "Foo"
+
+Notice: Indirect modification of overloaded element of Peoples has no effect in %sarray_access_008.php on line 42
+string(3) "Foo"
-Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in %sarray_access_008.php on line %d
+Notice: Indirect modification of overloaded element of Peoples has no effect in %sarray_access_008.php on line 44
+string(3) "Foo"
+===DONE===
diff --git a/tests/classes/array_access_012.phpt b/tests/classes/array_access_012.phpt
index 937dc3589b..8f85f296eb 100755
--- a/tests/classes/array_access_012.phpt
+++ b/tests/classes/array_access_012.phpt
@@ -33,4 +33,4 @@ $data['element'] = &$test;
Notice: Indirect modification of overloaded element of ArrayAccessImpl has no effect in %sarray_access_012.php on line 24
-Fatal error: Objects used as arrays in post/pre increment/decrement must return values by reference in %sarray_access_012.php on line %d
+Fatal error: Cannot assign by reference to overloaded object in %sarray_access_012.php on line 24