summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2013-07-10 13:00:47 +0200
committerAnatol Belski <ab@php.net>2013-07-10 13:00:47 +0200
commit29ac511b8afabaee27133bb3582142a49154eab5 (patch)
tree1c39ac050b80898401a7b732cbc9fb0f3a8ff30c
parentc7ee677f2f330bbcc8721b6a84dd3a05dc0c5541 (diff)
downloadphp-git-29ac511b8afabaee27133bb3582142a49154eab5.tar.gz
fix possible resource leak and make sure there's something to qsort()
-rw-r--r--main/streams/streams.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/main/streams/streams.c b/main/streams/streams.c
index cb80e9a16b..a835c25d9d 100644
--- a/main/streams/streams.c
+++ b/main/streams/streams.c
@@ -2358,6 +2358,7 @@ PHPAPI int _php_stream_scandir(char *dirname, char **namelist[], int flags, php_
} else {
if(vector_size*2 < vector_size) {
/* overflow */
+ php_stream_closedir(stream);
efree(vector);
return FAILURE;
}
@@ -2371,6 +2372,7 @@ PHPAPI int _php_stream_scandir(char *dirname, char **namelist[], int flags, php_
nfiles++;
if(vector_size < 10 || nfiles == 0) {
/* overflow */
+ php_stream_closedir(stream);
efree(vector);
return FAILURE;
}
@@ -2379,7 +2381,7 @@ PHPAPI int _php_stream_scandir(char *dirname, char **namelist[], int flags, php_
*namelist = vector;
- if (compare) {
+ if (nfiles > 0 && compare) {
qsort(*namelist, nfiles, sizeof(char *), (int(*)(const void *, const void *))compare);
}
return nfiles;