summaryrefslogtreecommitdiff
path: root/ext/overload/overload.c
diff options
context:
space:
mode:
authorAndrei Zmievski <andrei@php.net>2001-12-07 22:03:19 +0000
committerAndrei Zmievski <andrei@php.net>2001-12-07 22:03:19 +0000
commit7b7f46aa2d3fa2b7d078ce90a4ff50b542dbf9cc (patch)
treec546361dae3dc9869810377c6287365d54b03a16 /ext/overload/overload.c
parent363a8b69c9300ae73903e1acafb6f0308c3c4ca3 (diff)
downloadphp-git-7b7f46aa2d3fa2b7d078ce90a4ff50b542dbf9cc.tar.gz
- Fix memory leak when accessing undefined index or property.
- Only invoke call_get_handler() on an object in the chain if it's overloaded.
Diffstat (limited to 'ext/overload/overload.c')
-rw-r--r--ext/overload/overload.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/ext/overload/overload.c b/ext/overload/overload.c
index 90b52b26b1..31593b6756 100644
--- a/ext/overload/overload.c
+++ b/ext/overload/overload.c
@@ -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) {
}