]> granicus.if.org Git - php/commitdiff
Refactor _php_stream_scandir to avoid memleak
authorXinchen Hui <laruence@gmail.com>
Sun, 2 Mar 2014 14:47:59 +0000 (22:47 +0800)
committerXinchen Hui <laruence@gmail.com>
Sun, 2 Mar 2014 14:47:59 +0000 (22:47 +0800)
ext/standard/dir.c
main/php_streams.h
main/streams/streams.c

index ae38a20130b47e13e4d24919a155185f074dd649..357146146f7e9f6400bec859e0ebad45b54fa571 100644 (file)
@@ -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) {
index ad16d4b74f7e7b288d5784a0afae13402a2a21ce..39a4a961e7a3858a99dc6eafd2465b0ac7c1b5cd 100644 (file)
@@ -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);
index c595c802405fe522f513adf84fcb341b979a5d50..cd24a16440a41ffb8dcee6c8d2cbbce7d00b2483 100644 (file)
@@ -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;
 }