From 0fe209e317cb48133c087c693203376465ca4053 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Sun, 2 Mar 2014 22:47:59 +0800 Subject: [PATCH] Refactor _php_stream_scandir to avoid memleak --- ext/standard/dir.c | 4 ++-- main/php_streams.h | 8 ++++---- main/streams/streams.c | 20 ++++++++++---------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/ext/standard/dir.c b/ext/standard/dir.c index ae38a20130..357146146f 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -554,7 +554,7 @@ PHP_FUNCTION(scandir) char *dirn; int dirn_len; long flags = 0; - char **namelist; + zend_string **namelist; int n, i; zval *zcontext = NULL; php_stream_context *context = NULL; @@ -587,7 +587,7 @@ PHP_FUNCTION(scandir) array_init(return_value); for (i = 0; i < n; i++) { - add_next_index_string(return_value, namelist[i], 0); + add_next_index_str(return_value, namelist[i]); } if (n) { diff --git a/main/php_streams.h b/main/php_streams.h index ad16d4b74f..39a4a961e7 100644 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -348,11 +348,11 @@ PHPAPI php_stream_dirent *_php_stream_readdir(php_stream *dirstream, php_stream_ #define php_stream_closedir(dirstream) php_stream_close((dirstream)) #define php_stream_rewinddir(dirstream) php_stream_rewind((dirstream)) -PHPAPI int php_stream_dirent_alphasort(const char **a, const char **b); -PHPAPI int php_stream_dirent_alphasortr(const char **a, const char **b); +PHPAPI int php_stream_dirent_alphasort(const zend_string **a, const zend_string **b); +PHPAPI int php_stream_dirent_alphasortr(const zend_string **a, const zend_string **b); -PHPAPI int _php_stream_scandir(const char *dirname, char **namelist[], int flags, php_stream_context *context, - int (*compare) (const char **a, const char **b) TSRMLS_DC); +PHPAPI int _php_stream_scandir(const char *dirname, zend_string **namelist[], int flags, php_stream_context *context, + int (*compare) (const zend_string **a, const zend_string **b) TSRMLS_DC); #define php_stream_scandir(dirname, namelist, context, compare) _php_stream_scandir((dirname), (namelist), 0, (context), (compare) TSRMLS_CC) PHPAPI int _php_stream_set_option(php_stream *stream, int option, int value, void *ptrparam TSRMLS_DC); diff --git a/main/streams/streams.c b/main/streams/streams.c index c595c80240..cd24a16440 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -2243,28 +2243,28 @@ PHPAPI int php_stream_context_set_option(php_stream_context *context, /* {{{ php_stream_dirent_alphasort */ -PHPAPI int php_stream_dirent_alphasort(const char **a, const char **b) +PHPAPI int php_stream_dirent_alphasort(const zend_string **a, const zend_string **b) { - return strcoll(*a, *b); + return strcoll((*a)->val, (*b)->val); } /* }}} */ /* {{{ php_stream_dirent_alphasortr */ -PHPAPI int php_stream_dirent_alphasortr(const char **a, const char **b) +PHPAPI int php_stream_dirent_alphasortr(const zend_string **a, const zend_string **b) { - return strcoll(*b, *a); + return strcoll((*b)->val, (*a)->val); } /* }}} */ /* {{{ php_stream_scandir */ -PHPAPI int _php_stream_scandir(const char *dirname, char **namelist[], int flags, php_stream_context *context, - int (*compare) (const char **a, const char **b) TSRMLS_DC) +PHPAPI int _php_stream_scandir(const char *dirname, zend_string **namelist[], int flags, php_stream_context *context, + int (*compare) (const zend_string **a, const zend_string **b) TSRMLS_DC) { php_stream *stream; php_stream_dirent sdp; - char **vector = NULL; + zend_string **vector = NULL; unsigned int vector_size = 0; unsigned int nfiles = 0; @@ -2290,10 +2290,10 @@ PHPAPI int _php_stream_scandir(const char *dirname, char **namelist[], int flags } vector_size *= 2; } - vector = (char **) safe_erealloc(vector, vector_size, sizeof(char *), 0); + vector = (zend_string **) safe_erealloc(vector, vector_size, sizeof(char *), 0); } - vector[nfiles] = estrdup(sdp.d_name); + vector[nfiles] = STR_INIT(sdp.d_name, strlen(sdp.d_name), 0); nfiles++; if(vector_size < 10 || nfiles == 0) { @@ -2308,7 +2308,7 @@ PHPAPI int _php_stream_scandir(const char *dirname, char **namelist[], int flags *namelist = vector; if (nfiles > 0 && compare) { - qsort(*namelist, nfiles, sizeof(char *), (int(*)(const void *, const void *))compare); + qsort(*namelist, nfiles, sizeof(zend_string *), (int(*)(const void *, const void *))compare); } return nfiles; } -- 2.40.0