]> granicus.if.org Git - php/commitdiff
Fixed resource destruction
authorDmitry Stogov <dmitry@zend.com>
Wed, 7 May 2014 22:48:31 +0000 (02:48 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 7 May 2014 22:48:31 +0000 (02:48 +0400)
Zend/zend_list.c
Zend/zend_list.h
Zend/zend_variables.c
ext/mysql/php_mysql.c
ext/standard/proc_open.c

index 7892b7057cfe0719cc22b24996ead7ad361221bf..7ebe9c13a72b2480c9db6419828582d2dbaa5935 100644 (file)
@@ -46,13 +46,21 @@ ZEND_API zval *zend_list_insert(void *ptr, int type TSRMLS_DC)
 
 ZEND_API int _zend_list_delete(zend_resource *res TSRMLS_DC)
 {
-       if (GC_REFCOUNT(res) <= 0) {
+       if (--GC_REFCOUNT(res) <= 0) {
                return zend_hash_index_del(&EG(regular_list), res->handle);
        } else {
                return SUCCESS;
        }
 }
 
+ZEND_API int _zend_list_free(zend_resource *res TSRMLS_DC)
+{
+       if (GC_REFCOUNT(res) <= 0) {
+               return zend_hash_index_del(&EG(regular_list), res->handle);
+       } else {
+               return SUCCESS;
+       }
+}
 
 static void zend_resource_dtor(zend_resource *res TSRMLS_DC)
 {
index a9f96addb6d0214a9415242c9c5f1c3fe963e54f..c243b0d9ef0cd45510b87e38420d5bf36d71f1f2 100644 (file)
@@ -66,9 +66,11 @@ int zend_init_rsrc_list_dtors(void);
 void zend_destroy_rsrc_list_dtors(void);
 
 ZEND_API zval *zend_list_insert(void *ptr, int type TSRMLS_DC);
+ZEND_API int _zend_list_free(zend_resource *res TSRMLS_DC);
 ZEND_API int _zend_list_delete(zend_resource *res TSRMLS_DC);
 ZEND_API int _zend_list_close(zend_resource *res TSRMLS_DC);
 
+#define zend_list_free(res)                    _zend_list_free(res TSRMLS_CC)
 #define zend_list_delete(res)          _zend_list_delete(res TSRMLS_CC)
 #define zend_list_close(res)           _zend_list_close(res TSRMLS_CC)
 
index fcb0dd1b3e488ae640f78f45d31639fe081a01f9..ccdef2246c574694963794c85b980981bdcbac6d 100644 (file)
@@ -70,7 +70,7 @@ ZEND_API void _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC)
 
                                if (--GC_REFCOUNT(res) == 0) {
                                        /* destroy resource */
-                                       zend_list_delete(res);
+                                       zend_list_free(res);
                                }
                                break;
                        }
@@ -129,7 +129,7 @@ ZEND_API void _zval_dtor_func_for_ptr(zend_refcounted *p ZEND_FILE_LINE_DC)
                                TSRMLS_FETCH();
 
                                /* destroy resource */
-                               zend_list_delete(res);
+                               zend_list_free(res);
                                break;
                        }
                case IS_REFERENCE: {
index 0b27f1e44c006a87e81bcd18e254679024e0fd88..94bfb6cfd29c972b7892177d9bc4f0a81f095da7 100644 (file)
@@ -427,9 +427,7 @@ static void _free_mysql_result(zend_resource *rsrc TSRMLS_DC)
 static void php_mysql_set_default_link(zend_resource *link TSRMLS_DC)
 {
        if (MySG(default_link) != NULL) {
-               if (--GC_REFCOUNT((MySG(default_link))) == 0) {
-                       zend_list_delete(MySG(default_link));
-               }
+               zend_list_delete(MySG(default_link));
        }
        ++GC_REFCOUNT(link);
        MySG(default_link) = link;
index 0ab8ffa7e73c17a46b5043017429a4b236864684..2fb5553cdee71a74d84bba595c69c8ee4456214c 100644 (file)
@@ -222,9 +222,7 @@ static void proc_open_rsrc_dtor(zend_resource *rsrc TSRMLS_DC)
        /* Close all handles to avoid a deadlock */
        for (i = 0; i < proc->npipes; i++) {
                if (proc->pipes[i] != 0) {
-                       if (--GC_REFCOUNT(proc->pipes[i]) <= 0) {
-                               zend_list_delete(proc->pipes[i]);
-                       }
+                       zend_list_delete(proc->pipes[i]);
                        proc->pipes[i] = 0;
                }
        }