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); |