cvs: php4 /ext/overload overload.c

From: Date: Fri, 07 Dec 2001 22:03:19 +0000
Subject: cvs: php4 /ext/overload overload.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-8516@lists.php.net to get a copy of this message
andrei Fri Dec 7 17:03:19 2001 EDT Modified files: /php4/ext/overload overload.c Log: - Fix memory leak when accessing undefined index or property. - Only invoke call_get_handler() on an object in the chain if it's overloaded. Index: php4/ext/overload/overload.c diff -u php4/ext/overload/overload.c:1.6 php4/ext/overload/overload.c:1.7 --- php4/ext/overload/overload.c:1.6 Fri Dec 7 09:30:55 2001 +++ php4/ext/overload/overload.c Fri Dec 7 17:03:19 2001 @@ -297,6 +297,7 @@ /* 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 @@ 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 @@ 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 @@ Z_LVAL(overloaded_property->element), (void **)&real_prop) == FAILURE) { CLEANUP_OO_CHAIN(); + zval_dtor(&object); return result; } } @@ -397,14 +403,16 @@ 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) { }

« previous php.cvs (#8516) next »