this patch fixes one common, and 4 rare memory leaks in read-tree.c.

        Ingo

Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>

--- read-tree.c.orig
+++ read-tree.c
@@ -23,23 +23,27 @@ static int read_one_entry(unsigned char 
 
 static int read_tree(unsigned char *sha1, const char *base, int baselen)
 {
-       void *buffer;
+       void *buffer0, *buffer;
        unsigned long size;
        char type[20];
 
-       buffer = read_sha1_file(sha1, type, &size);
+       buffer0 = buffer = read_sha1_file(sha1, type, &size);
        if (!buffer)
                return -1;
-       if (strcmp(type, "tree"))
+       if (strcmp(type, "tree")) {
+               free(buffer);
                return -1;
+       }
        while (size) {
                int len = strlen(buffer)+1;
                unsigned char *sha1 = buffer + len;
                char *path = strchr(buffer, ' ')+1;
                unsigned int mode;
 
-               if (size < len + 20 || sscanf(buffer, "%o", &mode) != 1)
+               if (size < len + 20 || sscanf(buffer, "%o", &mode) != 1) {
+                       free(buffer0);
                        return -1;
+               }
 
                buffer = sha1 + 20;
                size -= len + 20;
@@ -53,13 +57,19 @@ static int read_tree(unsigned char *sha1
                        newbase[baselen + pathlen] = '/';
                        retval = read_tree(sha1, newbase, baselen + pathlen + 
1);
                        free(newbase);
-                       if (retval)
+                       if (retval) {
+                               free(buffer0);
                                return -1;
+                       }
                        continue;
                }
-               if (read_one_entry(sha1, base, baselen, path, mode) < 0)
+               if (read_one_entry(sha1, base, baselen, path, mode) < 0) {
+                       free(buffer0);
                        return -1;
+               }
        }
+       free(buffer0);
+
        return 0;
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to