Fixed covariance of return-by-ref constraints

This commit is contained in:
Etienne Kneuss 2010-11-03 15:40:24 +00:00
parent 21638aed88
commit 9d25e7ee7b
3 changed files with 45 additions and 1 deletions

1
NEWS
View File

@ -50,6 +50,7 @@
large amount of data) (CVE-2010-3710). (Adam)
- Fixed ReflectionProperty::isDefault() giving a wrong result for properties
obtained with ReflectionClass::getProperties(). (Gustavo)
- Fixed covariance of return-by-ref constraints. (Etienne)
- Fixed bug #53198 (changing INI setting "from" with ini_set did not have any
effect). (Gustavo)

View File

@ -0,0 +1,40 @@
--TEST--
Covariant return-by-ref constraints
--FILE--
<?php
class A implements ArrayAccess {
public $foo = array();
public function &offsetGet($n) {
return $this->foo[$n];
}
public function offsetSet($n, $v) {
}
public function offsetUnset($n) {
}
public function offsetExists($n) {
}
}
$a = new A;
$a['foo']['bar'] = 2;
var_dump($a);
?>
==DONE==
--EXPECTF--
object(A)#1 (1) {
["foo"]=>
array(1) {
["foo"]=>
array(1) {
["bar"]=>
int(2)
}
}
}
==DONE==

View File

@ -2557,7 +2557,8 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c
return 0;
}
if (fe->common.return_reference != proto->common.return_reference) {
/* by-ref constraints on return values are covariant */
if (proto->common.return_reference && !fe->common.return_reference) {
return 0;
}
@ -2581,6 +2582,8 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c
/* Only one has an array type hint and the other one doesn't */
return 0;
}
/* by-ref constraints on arguments are invariant */
if (fe->common.arg_info[i].pass_by_reference != proto->common.arg_info[i].pass_by_reference) {
return 0;
}