The following commit has been merged in the master branch:
commit 5ad592f7eff684e44149aff8efa4190d2e81f6f8
Author: Guillem Jover <[email protected]>
Date:   Mon Nov 9 21:16:07 2009 +0100

    libcompat: Do not preallocate list before the loop in scandir
    
    Let the realloc in the loop take care of it once it's needed, this way
    we get rid of an additional point of failure.

diff --git a/lib/compat/scandir.c b/lib/compat/scandir.c
index 2fc8d01..ea7c484 100644
--- a/lib/compat/scandir.c
+++ b/lib/compat/scandir.c
@@ -57,12 +57,8 @@ scandir(const char *dir, struct dirent ***namelist,
        if (!d)
                return -1;
 
-       used = 0;
-       avail = 20;
-
-       list = malloc(avail * sizeof(struct dirent *));
-       if (!list)
-               return cleanup(d, list, used);
+       list = NULL;
+       used = avail = 0;
 
        while ((e = readdir(d)) != NULL) {
                if (filter != NULL && !filter(e))
@@ -71,7 +67,10 @@ scandir(const char *dir, struct dirent ***namelist,
                if (used >= avail - 1) {
                        struct dirent **newlist;
 
-                       avail += avail;
+                       if (avail)
+                               avail *= 2;
+                       else
+                               avail = 20;
                        newlist = realloc(list, avail * sizeof(struct dirent 
*));
                        if (!newlist)
                                return cleanup(d, list, used);

-- 
dpkg's main repository


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to