From: Dmitry Stogov Date: Wed, 24 Jun 2009 08:53:44 +0000 (+0000) Subject: Fixed bug #48643 (String functions memory issue) X-Git-Tag: php-5.4.0alpha1~191^2~3250 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2cdd26b0b79e878a0efea540405f9caa4e2c3ec6;p=php Fixed bug #48643 (String functions memory issue) --- diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 3bbbeabb52..39f4b48846 100755 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -1723,37 +1723,53 @@ zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, zva static int spl_filesystem_object_cast(zval *readobj, zval *writeobj, int type, void *extra TSRMLS_DC) { spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(readobj TSRMLS_CC); + int ret; + zval retval; + zval *retval_ptr = &retval; switch (intern->type) { case SPL_FS_INFO: case SPL_FS_FILE: if (type == intern->file_name_type) { - ZVAL_ZSTRL(writeobj, intern->file_name_type, intern->file_name, intern->file_name_len, 1); - return SUCCESS; + ZVAL_ZSTRL(retval_ptr, intern->file_name_type, intern->file_name, intern->file_name_len, 1); + ret = SUCCESS; + break; } if (type == IS_STRING) { - ZVAL_ZSTRL(writeobj, intern->file_name_type, intern->file_name, intern->file_name_len, ZSTR_DUPLICATE); - zval_unicode_to_string_ex(writeobj, ZEND_U_CONVERTER(((UConverter *)extra)) TSRMLS_CC); - return SUCCESS; + ZVAL_ZSTRL(retval_ptr, intern->file_name_type, intern->file_name, intern->file_name_len, ZSTR_DUPLICATE); + zval_unicode_to_string_ex(retval_ptr, ZEND_U_CONVERTER(((UConverter *)extra)) TSRMLS_CC); + ret = SUCCESS; + break; } if (type == IS_UNICODE) { - ZVAL_ASCII_STRINGL(writeobj, intern->file_name.s, intern->file_name_len, 1); - return SUCCESS; + ZVAL_ASCII_STRINGL(retval_ptr, intern->file_name.s, intern->file_name_len, 1); + ret = SUCCESS; + break; } + ZVAL_NULL(retval_ptr); + ret = FAILURE; break; case SPL_FS_DIR: if (type == IS_STRING) { - ZVAL_STRING(writeobj, intern->u.dir.entry.d_name, 1); - return SUCCESS; + ZVAL_STRING(retval_ptr, intern->u.dir.entry.d_name, 1); + ret = SUCCESS; + break; } if (type == IS_UNICODE) { - ZVAL_ASCII_STRING(writeobj, intern->u.dir.entry.d_name, 1); - return SUCCESS; + ZVAL_ASCII_STRING(retval_ptr, intern->u.dir.entry.d_name, 1); + ret = SUCCESS; + break; } - break; + default: + ZVAL_NULL(retval_ptr); + ret = FAILURE; + break; + } + if (readobj == writeobj) { + zval_dtor(readobj); } - ZVAL_NULL(writeobj); - return FAILURE; + ZVAL_ZVAL(writeobj, retval_ptr, 0, 0); + return ret; } /* }}} */