diff options
| author | Marcus Boerger <helly@php.net> | 2003-07-01 19:13:50 +0000 | 
|---|---|---|
| committer | Marcus Boerger <helly@php.net> | 2003-07-01 19:13:50 +0000 | 
| commit | 35c40932e86b57e3eb8fac441522e9fa86f11ed8 (patch) | |
| tree | e87b64fe4be1f7caee5fed9fadac210beee97c74 /Zend/zend_objects.c | |
| parent | d2b1b6c700c72719ec5f575e6e76edd78a2fa688 (diff) | |
| download | php-git-35c40932e86b57e3eb8fac441522e9fa86f11ed8.tar.gz | |
Fix destructor visibility
Diffstat (limited to 'Zend/zend_objects.c')
| -rw-r--r-- | Zend/zend_objects.c | 19 | 
1 files changed, 17 insertions, 2 deletions
| diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 911fc700e5..e998263626 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -26,7 +26,9 @@  static inline void zend_objects_call_destructor(zend_object *object, zend_object_handle handle TSRMLS_DC)  { -	if (object->ce->destructor) { +	zend_function *destructor = object->ce->destructor; + +	if (destructor) {  		zval *obj;  		zval *destructor_func_name;  		zval *retval_ptr; @@ -38,13 +40,26 @@ static inline void zend_objects_call_destructor(zend_object *object, zend_object  		obj->value.obj.handlers = &std_object_handlers;  		zval_copy_ctor(obj); -  		/* FIXME: Optimize this so that we use the old_object->ce->destructor function pointer instead of the name */  		MAKE_STD_ZVAL(destructor_func_name);  		destructor_func_name->type = IS_STRING;  		destructor_func_name->value.str.val = estrndup("__destruct", sizeof("__destruct")-1);  		destructor_func_name->value.str.len = sizeof("__destruct")-1; +		if (destructor->op_array.fn_flags & ZEND_ACC_PRIVATE) { +			/* Ensure that if we're calling a private function, we're allowed to do so. +			 */ +			if (object->ce != EG(scope)) { +				zend_error(E_ERROR, "Call to private destructor from context '%s'", EG(scope) ? EG(scope)->name : ""); +			} +		} else if ((destructor->common.fn_flags & ZEND_ACC_PROTECTED)) { +			/* Ensure that if we're calling a protected function, we're allowed to do so. +			 */ +			if (!zend_check_protected(destructor->common.scope, EG(scope))) { +				zend_error(E_ERROR, "Call to protected destructor from context '%s'", EG(scope) ? EG(scope)->name : ""); +			} +		} +  		ZEND_INIT_SYMTABLE(&symbol_table);  		call_user_function_ex(NULL, &obj, destructor_func_name, &retval_ptr, 0, NULL, 0, &symbol_table TSRMLS_CC); | 
