]> granicus.if.org Git - php/commitdiff
fix potential overflow in _php_stream_scandir
authorStanislav Malyshev <stas@php.net>
Fri, 8 Jun 2012 06:05:23 +0000 (23:05 -0700)
committerStanislav Malyshev <stas@php.net>
Fri, 8 Jun 2012 06:08:35 +0000 (23:08 -0700)
NEWS
main/streams/streams.c

diff --git a/NEWS b/NEWS
index 9d70ebd43e091fa7e9a98fdf9f196dc905296f80..380979b14b451446455c1abfce5d53fb266d7083 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,8 @@ PHP                                                                        NEWS
 
 - Core:
   . Fixed CVE-2012-2143. (Solar Designer)
+  . Fixed potential overflow in _php_stream_scandir. (Jason Powell,
+    Stas)
 
 - Fileinfo:
   . Fixed magic file regex support. (Felipe)
index fe7800b9feb68a1945bd5f8070d6956e2b8edc40..43cb0104f356a36cef0c30182634b03e1e4cbbfb 100755 (executable)
@@ -2262,8 +2262,8 @@ PHPAPI int _php_stream_scandir(char *dirname, char **namelist[], int flags, php_
        php_stream *stream;
        php_stream_dirent sdp;
        char **vector = NULL;
-       int vector_size = 0;
-       int nfiles = 0;
+       unsigned int vector_size = 0;
+       unsigned int nfiles = 0;
 
        if (!namelist) {
                return FAILURE;
@@ -2281,12 +2281,17 @@ PHPAPI int _php_stream_scandir(char *dirname, char **namelist[], int flags, php_
                        } else {
                                vector_size *= 2;
                        }
-                       vector = (char **) erealloc(vector, vector_size * sizeof(char *));
+                       vector = (char **) safe_erealloc(vector, vector_size, sizeof(char *), 0);
                }
 
                vector[nfiles] = estrdup(sdp.d_name);
 
                nfiles++;
+               if(vector_size < 10 || nfiles == 0) {
+                       /* overflow */
+                       efree(vector);
+                       return FAILURE;
+               }
        }
        php_stream_closedir(stream);