diff options
| author | Dmitry Stogov <dmitry@php.net> | 2009-06-24 08:53:18 +0000 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@php.net> | 2009-06-24 08:53:18 +0000 |
| commit | e583ce82ec617a4631a67df9e7c39ca877e2152f (patch) | |
| tree | 28114120762e90daf5c9bba2bf75003c2ca6b9ca /ext | |
| parent | a8e42c91b07ac301632aa2be81d3327669cdc275 (diff) | |
| download | php-git-e583ce82ec617a4631a67df9e7c39ca877e2152f.tar.gz | |
Fixed bug #48643 (String functions memory issue)
Diffstat (limited to 'ext')
| -rwxr-xr-x | ext/spl/spl_directory.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 48622945e5..a60ac3c5c4 100755 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -1604,13 +1604,34 @@ static int spl_filesystem_object_cast(zval *readobj, zval *writeobj, int type TS switch (intern->type) { case SPL_FS_INFO: case SPL_FS_FILE: - ZVAL_STRINGL(writeobj, intern->file_name, intern->file_name_len, 1); + if (readobj == writeobj) { + zval retval; + zval *retval_ptr = &retval; + + ZVAL_STRINGL(retval_ptr, intern->file_name, intern->file_name_len, 1); + zval_dtor(readobj); + ZVAL_ZVAL(writeobj, retval_ptr, 0, 0); + } else { + ZVAL_STRINGL(writeobj, intern->file_name, intern->file_name_len, 1); + } return SUCCESS; case SPL_FS_DIR: - ZVAL_STRING(writeobj, intern->u.dir.entry.d_name, 1); + if (readobj == writeobj) { + zval retval; + zval *retval_ptr = &retval; + + ZVAL_STRING(retval_ptr, intern->u.dir.entry.d_name, 1); + zval_dtor(readobj); + ZVAL_ZVAL(writeobj, retval_ptr, 0, 0); + } else { + ZVAL_STRING(writeobj, intern->u.dir.entry.d_name, 1); + } return SUCCESS; } } + if (readobj == writeobj) { + zval_dtor(readobj); + } ZVAL_NULL(writeobj); return FAILURE; } |
