diff options
author | Xinchen Hui <laruence@php.net> | 2015-04-20 11:48:21 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@php.net> | 2015-04-20 11:48:21 +0800 |
commit | d66045fe73fb646f15a45286313231908e656a37 (patch) | |
tree | d0bec3a03ea3deafdde11d6c6a5f003f684aaf33 /Zend/zend_list.c | |
parent | a819404e9e4a96ee80975e05de053a6e210f6c41 (diff) | |
download | php-git-d66045fe73fb646f15a45286313231908e656a37.tar.gz |
Fixed bug #69485 (Double free on zend_list_dtor).
Diffstat (limited to 'Zend/zend_list.c')
-rw-r--r-- | Zend/zend_list.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/Zend/zend_list.c b/Zend/zend_list.c index 2c653782ee..261489b4a1 100644 --- a/Zend/zend_list.c +++ b/Zend/zend_list.c @@ -65,17 +65,19 @@ ZEND_API int zend_list_free(zend_resource *res) static void zend_resource_dtor(zend_resource *res) { zend_rsrc_list_dtors_entry *ld; + zend_resource r = *res; - ld = zend_hash_index_find_ptr(&list_destructors, res->type); + res->type = -1; + res->ptr = NULL; + + ld = zend_hash_index_find_ptr(&list_destructors, r.type); if (ld) { if (ld->list_dtor_ex) { - ld->list_dtor_ex(res); + ld->list_dtor_ex(&r); } } else { - zend_error(E_WARNING,"Unknown list entry type (%d)", res->type); + zend_error(E_WARNING, "Unknown list entry type (%d)", r.type); } - res->ptr = NULL; - res->type = -1; } @@ -178,8 +180,8 @@ void list_entry_destructor(zval *zv) { zend_resource *res = Z_RES_P(zv); + ZVAL_UNDEF(zv); if (res->type >= 0) { - zend_resource_dtor(res); } efree_size(res, sizeof(zend_resource)); |