]> granicus.if.org Git - php/commitdiff
fixed persistent reaource destruction
authorDmitry Stogov <dmitry@zend.com>
Fri, 11 Apr 2014 10:47:38 +0000 (14:47 +0400)
committerDmitry Stogov <dmitry@zend.com>
Fri, 11 Apr 2014 10:47:38 +0000 (14:47 +0400)
Zend/zend_list.c

index 30d07aed37a7abdf9a6cbb7a1207f92d87c735a2..5521964588a4058ce741da52049298ecd058f3a7 100644 (file)
@@ -174,11 +174,29 @@ void list_entry_destructor(zval *zv)
 void plist_entry_destructor(zval *zv)
 {
        zend_resource *res = Z_RES_P(zv);
-       zend_rsrc_list_dtors_entry *ld;
-       TSRMLS_FETCH();
 
        if (res->type >= 0) {
-               zend_resource_dtor(res TSRMLS_CC);
+               zend_rsrc_list_dtors_entry *ld;
+               TSRMLS_FETCH();
+       
+               ld = zend_hash_index_find_ptr(&list_destructors, res->type);
+               if (ld) {
+                       switch (ld->type) {
+                               case ZEND_RESOURCE_LIST_TYPE_STD:
+                                       if (ld->plist_dtor) {
+                                               (ld->plist_dtor)(res->ptr);
+                                       }
+                                       break;
+                               case ZEND_RESOURCE_LIST_TYPE_EX:
+                                       if (ld->plist_dtor_ex) {
+                                               ld->plist_dtor_ex(res TSRMLS_CC);
+                                       }
+                                       break;
+                               EMPTY_SWITCH_DEFAULT_CASE()
+                       }
+               } else {
+                       zend_error(E_WARNING,"Unknown list entry type (%d)", res->type);
+               }
        }
        free(res);
 }