diff options
author | Marcus Boerger <helly@php.net> | 2003-11-08 14:06:08 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2003-11-08 14:06:08 +0000 |
commit | 316854323d63ed98cb0ce289a5ffd17f9ee938d0 (patch) | |
tree | f70748696fd9420dd73445493f3dccf5e05b9759 /Zend/zend_operators.c | |
parent | ed451570470ebaf24ffe2a2d20403c6749d32318 (diff) | |
download | php-git-316854323d63ed98cb0ce289a5ffd17f9ee938d0.tar.gz |
Handle exceptions in casting more gracefully.
This fixes bug #26166
Diffstat (limited to 'Zend/zend_operators.c')
-rw-r--r-- | Zend/zend_operators.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index f95a6f6aeb..453f1f0f5c 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -445,7 +445,6 @@ ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC) { long lval; double dval; - TSRMLS_FETCH(); switch (op->type) { case IS_NULL: @@ -465,6 +464,7 @@ ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC) break; case IS_RESOURCE: { long tmp = op->value.lval; + TSRMLS_FETCH(); zend_list_delete(op->value.lval); op->value.str.val = (char *) emalloc(sizeof("Resource id #")-1 + MAX_LENGTH_OF_LONG); @@ -478,6 +478,7 @@ ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC) op->value.str.len = zend_sprintf(op->value.str.val, "%ld", lval); /* SAFE */ break; case IS_DOUBLE: { + TSRMLS_FETCH(); dval = op->value.dval; op->value.str.val = (char *) emalloc_rel(MAX_LENGTH_OF_DOUBLE + EG(precision) + 1); op->value.str.len = zend_sprintf(op->value.str.val, "%.*G", (int) EG(precision), dval); /* SAFE */ @@ -490,11 +491,11 @@ ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC) op->value.str.val = estrndup_rel("Array", sizeof("Array")-1); op->value.str.len = sizeof("Array")-1; break; - case IS_OBJECT: + case IS_OBJECT: { + TSRMLS_FETCH(); if (op->value.obj.handlers->cast_object) { zval tmp; - TSRMLS_FETCH(); - if (op->value.obj.handlers->cast_object(op, &tmp, IS_STRING, 1 TSRMLS_CC) == SUCCESS) { + if (op->value.obj.handlers->cast_object(op, &tmp, IS_STRING, 1 TSRMLS_CC) == SUCCESS && tmp.type == IS_STRING) { zval_dtor(op); *op = tmp; break; @@ -507,6 +508,7 @@ ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC) op->value.str.val = estrndup_rel("Object", sizeof("Object")-1); op->value.str.len = sizeof("Object")-1; break; + } default: zval_dtor(op); ZVAL_BOOL(op, 0); |