summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2001-04-28 02:06:35 +0000
committerZeev Suraski <zeev@php.net>2001-04-28 02:06:35 +0000
commit882751dd7dd77c1b826c4a4b3e0f151b136d7c68 (patch)
treedba8dd3eafa20966d44c5c75adeda62ce80ec9e6
parentb3bd55c2cb39cffb0cb4f7559c26f9fe14572e3f (diff)
downloadphp-git-882751dd7dd77c1b826c4a4b3e0f151b136d7c68.tar.gz
Resources weren't being properly destroyed by the convert_to_*() functions
-rw-r--r--Zend/zend_operators.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index db632e87f0..b02a727d31 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -127,7 +127,10 @@ ZEND_API void convert_scalar_to_number(zval *op)
break;
}
STR_FREE(strval);
- } else if (op->type==IS_BOOL || op->type==IS_RESOURCE) {
+ } else if (op->type==IS_BOOL) {
+ op->type = IS_LONG;
+ } else if (op->type==IS_RESOURCE) {
+ zend_list_delete(op->value.lval);
op->type = IS_LONG;
} else if (op->type==IS_NULL) {
op->type = IS_LONG;
@@ -152,7 +155,12 @@ ZEND_API void convert_scalar_to_number(zval *op)
break; \
} \
(op) = &(holder); \
- } else if ((op)->type==IS_BOOL || (op)->type==IS_RESOURCE) { \
+ } else if ((op)->type==IS_BOOL) { \
+ (holder).value.lval = (op)->value.lval; \
+ (holder).type = IS_LONG; \
+ (op) = &(holder); \
+ } else if ((op)->type==IS_RESOURCE) { \
+ zend_list_delete((op)->value.lval); \
(holder).value.lval = (op)->value.lval; \
(holder).type = IS_LONG; \
(op) = &(holder); \
@@ -167,7 +175,12 @@ ZEND_API void convert_scalar_to_number(zval *op)
#define zendi_convert_to_long(op, holder, result) \
if (op==result) { \
convert_to_long(op); \
- } else if ((op)->type==IS_BOOL || (op)->type==IS_RESOURCE) { \
+ } else if ((op)->type==IS_BOOL) { \
+ (holder).value.lval = (op)->value.lval; \
+ (holder).type = IS_LONG; \
+ (op) = &(holder); \
+ } else if ((op)->type==IS_RESOURCE) { \
+ zend_list_delete((op)->value.lval); \
(holder).value.lval = (op)->value.lval; \
(holder).type = IS_LONG; \
(op) = &(holder); \
@@ -207,6 +220,8 @@ ZEND_API void convert_scalar_to_number(zval *op)
(holder).value.lval = 0; \
break; \
case IS_RESOURCE: \
+ zend_list_delete((op)->value.lval); \
+ /* break missing intentionally */ \
case IS_LONG: \
(holder).value.lval = ((op)->value.lval ? 1 : 0); \
break; \
@@ -252,6 +267,8 @@ ZEND_API void convert_to_long_base(zval *op, int base)
op->value.lval = 0;
break;
case IS_RESOURCE:
+ zend_list_delete(op->value.lval);
+ /* break missing intentionally */
case IS_BOOL:
case IS_LONG:
break;
@@ -294,6 +311,8 @@ ZEND_API void convert_to_double(zval *op)
op->value.dval = 0.0;
break;
case IS_RESOURCE:
+ zend_list_delete(op->value.lval);
+ /* break missing intentionally */
case IS_BOOL:
case IS_LONG:
op->value.dval = (double) op->value.lval;
@@ -345,6 +364,8 @@ ZEND_API void convert_to_boolean(zval *op)
op->value.lval = 0;
break;
case IS_RESOURCE:
+ zend_list_delete(op->value.lval);
+ /* break missing intentionally */
case IS_LONG:
op->value.lval = (op->value.lval ? 1 : 0);
break;
@@ -405,6 +426,8 @@ ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC)
break;
case IS_RESOURCE: {
long tmp = op->value.lval;
+
+ zend_list_delete(op->value.lval);
op->value.str.val = (char *) emalloc(sizeof("Resource id #")-1 + MAX_LENGTH_OF_LONG);
op->value.str.len = sprintf(op->value.str.val, "Resource id #%ld", tmp);
break;