com php-src: Fix resource leak when casting to string: Zend/zend_operators.c Zend/zend_variables.c
| From: | Nikita Popov | Date: | Sat, 24 Jan 2015 22:18:26 +0000 |
| Subject: | com php-src: Fix resource leak when casting to string: Zend/zend_operators.c Zend/zend_variables.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-84359@lists.php.net to get a copy of this message | ||
Commit: 6093c9370b943f7ba69ee74288ffedc29acd8f92
Author: Nikita Popov <nikic@php.net> Sat, 24 Jan 2015 23:11:05 +0100
Parents: 05166566db19fb02d0b31eaa64238bf58299d222
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=6093c9370b943f7ba69ee74288ffedc29acd8f92
Log:
Fix resource leak when casting to string
Changed paths:
M Zend/zend_operators.c
M Zend/zend_variables.c
Diff:
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 0173251..f178c34 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -292,13 +292,10 @@ ZEND_API void convert_to_long_base(zval *op, int base) /* {{{ */
case IS_TRUE:
ZVAL_LONG(op, 1);
break;
- case IS_RESOURCE: {
- zend_long l = Z_RES_HANDLE_P(op);
- zval_ptr_dtor(op);
- ZVAL_LONG(op, l);
- }
- /* break missing intentionally */
- Z_TYPE_INFO_P(op) = IS_LONG;
+ case IS_RESOURCE:
+ tmp = Z_RES_HANDLE_P(op);
+ zval_ptr_dtor(op);
+ ZVAL_LONG(op, tmp);
break;
case IS_LONG:
break;
@@ -489,7 +486,7 @@ ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC) /* {{{ */
case IS_UNDEF:
case IS_NULL:
case IS_FALSE: {
- ZVAL_EMPTY_STRING(op);
+ ZVAL_EMPTY_STRING(op);
break;
}
case IS_TRUE:
@@ -500,6 +497,7 @@ ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC) /* {{{ */
case IS_RESOURCE: {
char buf[sizeof("Resource id #") + MAX_LENGTH_OF_LONG];
int len = snprintf(buf, sizeof(buf), "Resource id #" ZEND_LONG_FMT,
(zend_long)Z_RES_HANDLE_P(op));
+ zval_ptr_dtor(op);
ZVAL_NEW_STR(op, zend_string_init(buf, len, 0));
break;
}
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c
index 9ada1e4..6e98344 100644
--- a/Zend/zend_variables.c
+++ b/Zend/zend_variables.c
@@ -41,6 +41,8 @@ ZEND_API void _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC)
zend_array *arr = (zend_array*)p;
if (arr != &EG(symbol_table)) {
+ ZEND_ASSERT(GC_REFCOUNT(arr) <= 1);
+
/* break possible cycles */
GC_TYPE(arr) = IS_NULL;
GC_REMOVE_FROM_BUFFER(arr);