summaryrefslogtreecommitdiff
path: root/Zend/zend_objects_API.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2017-05-02 22:32:33 +0200
committerNikita Popov <nikita.ppv@gmail.com>2017-05-04 20:57:25 +0200
commit5af997ed81fc3e86544679d7a07b152ee13d1e04 (patch)
tree4cc121cc092f272b2ed3c660f494f48b5da11682 /Zend/zend_objects_API.c
parent3abef9c9609eef04f268e1fd002e6ca7edac11fa (diff)
downloadphp-git-5af997ed81fc3e86544679d7a07b152ee13d1e04.tar.gz
Don't use zend_try around dtor_obj() and free_obj()
Without these zend_trys we may a) leak the object (fine) b) don't add it to the free list (also fine, we just lose an object store bucket) c) don't remove it from the GC root buffer (also fine, because GC explicitly checks for both FREE_CALLED and invalid buckets)
Diffstat (limited to 'Zend/zend_objects_API.c')
-rw-r--r--Zend/zend_objects_API.c22
1 files changed, 4 insertions, 18 deletions
diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c
index 3aedba1bda..53a0c3be23 100644
--- a/Zend/zend_objects_API.c
+++ b/Zend/zend_objects_API.c
@@ -152,18 +152,12 @@ ZEND_API void zend_objects_store_del(zend_object *object) /* {{{ */
if (EG(objects_store).object_buckets &&
IS_OBJ_VALID(EG(objects_store).object_buckets[object->handle])) {
if (GC_REFCOUNT(object) == 0) {
- int failure = 0;
-
if (!(GC_FLAGS(object) & IS_OBJ_DESTRUCTOR_CALLED)) {
GC_FLAGS(object) |= IS_OBJ_DESTRUCTOR_CALLED;
if (object->handlers->dtor_obj) {
GC_REFCOUNT(object)++;
- zend_try {
- object->handlers->dtor_obj(object);
- } zend_catch {
- failure = 1;
- } zend_end_try();
+ object->handlers->dtor_obj(object);
GC_REFCOUNT(object)--;
}
}
@@ -176,13 +170,9 @@ ZEND_API void zend_objects_store_del(zend_object *object) /* {{{ */
if (!(GC_FLAGS(object) & IS_OBJ_FREE_CALLED)) {
GC_FLAGS(object) |= IS_OBJ_FREE_CALLED;
if (object->handlers->free_obj) {
- zend_try {
- GC_REFCOUNT(object)++;
- object->handlers->free_obj(object);
- GC_REFCOUNT(object)--;
- } zend_catch {
- failure = 1;
- } zend_end_try();
+ GC_REFCOUNT(object)++;
+ object->handlers->free_obj(object);
+ GC_REFCOUNT(object)--;
}
}
ptr = ((char*)object) - object->handlers->offset;
@@ -190,10 +180,6 @@ ZEND_API void zend_objects_store_del(zend_object *object) /* {{{ */
efree(ptr);
ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(handle);
}
-
- if (failure) {
- zend_bailout();
- }
} else {
GC_REFCOUNT(object)--;
}