- Fix memory leak when accessing undefined index or property.

- Only invoke call_get_handler() on an object in the chain if it's overloaded.
This commit is contained in:
Andrei Zmievski 2001-12-07 22:03:19 +00:00
parent 363a8b69c9
commit 7b7f46aa2d

View File

@ -297,6 +297,7 @@ static zval overload_get_property(zend_property_reference *property_reference)
/* Trying to access a property on a non-object. */
if (Z_TYPE(object) != IS_OBJECT) {
CLEANUP_OO_CHAIN();
zval_dtor(&object);
return result;
}
@ -307,19 +308,22 @@ static zval overload_get_property(zend_property_reference *property_reference)
result = **real_prop;
/* printf("is_ref: %d, refcount: %d\n", (*real_prop)->is_ref, (*real_prop)->refcount); */
/* REPLACE_ZVAL_VALUE(&result_ptr, *real_prop, 1); */
} else if (!call_get_handler(&object,
&overloaded_property->element,
&result_ptr TSRMLS_CC)) {
} else if (Z_OBJCE(object)->handle_property_get == overload_get_property &&
call_get_handler(&object,
&overloaded_property->element,
&result_ptr TSRMLS_CC)) {
got_prop = 1;
} else {
php_error(E_NOTICE, "Undefined property: %s", Z_STRVAL(overloaded_property->element));
CLEANUP_OO_CHAIN();
zval_dtor(&object);
return result;
} else {
got_prop = 1;
}
} else if (Z_TYPE_P(overloaded_property) == OE_IS_ARRAY) {
/* Trying to access index on a non-array. */
if (Z_TYPE(object) != IS_ARRAY) {
CLEANUP_OO_CHAIN();
zval_dtor(&object);
return result;
}
@ -329,6 +333,7 @@ static zval overload_get_property(zend_property_reference *property_reference)
Z_STRLEN(overloaded_property->element)+1,
(void **)&real_prop) == FAILURE) {
CLEANUP_OO_CHAIN();
zval_dtor(&object);
return result;
}
} else if (Z_TYPE(overloaded_property->element) == IS_LONG) {
@ -336,6 +341,7 @@ static zval overload_get_property(zend_property_reference *property_reference)
Z_LVAL(overloaded_property->element),
(void **)&real_prop) == FAILURE) {
CLEANUP_OO_CHAIN();
zval_dtor(&object);
return result;
}
}
@ -397,14 +403,16 @@ static int overload_set_property(zend_property_reference *property_reference, zv
return SUCCESS;
}
if (!call_get_handler(*object,
&overloaded_property->element,
&result_ptr TSRMLS_CC)) {
if (Z_OBJCE_PP(object)->handle_property_get == overload_get_property &&
call_get_handler(*object,
&overloaded_property->element,
&result_ptr TSRMLS_CC)) {
object = &result_ptr;
} else {
php_error(E_NOTICE, "Undefined property: %s", Z_STRVAL(overloaded_property->element));
CLEANUP_OO_CHAIN();
return FAILURE;
} else
object = &result_ptr;
}
}
} else if (Z_TYPE_P(overloaded_property) == OE_IS_ARRAY) {
}