summaryrefslogtreecommitdiff
path: root/Zend/zend_objects.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-07-01 19:13:50 +0000
committerMarcus Boerger <helly@php.net>2003-07-01 19:13:50 +0000
commit35c40932e86b57e3eb8fac441522e9fa86f11ed8 (patch)
treee87b64fe4be1f7caee5fed9fadac210beee97c74 /Zend/zend_objects.c
parentd2b1b6c700c72719ec5f575e6e76edd78a2fa688 (diff)
downloadphp-git-35c40932e86b57e3eb8fac441522e9fa86f11ed8.tar.gz
Fix destructor visibility
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r--Zend/zend_objects.c19
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);