receive-pack: allow using --strict mode for unpacking objects
[gitweb.git] / tree-walk.c
index cbb24eb3f663cd0370f528d983a2266a55b91c4f..142205ddc3e33fb8024171daf4c6b1bee1dba476 100644 (file)
@@ -7,6 +7,9 @@ static const char *get_mode(const char *str, unsigned int *modep)
        unsigned char c;
        unsigned int mode = 0;
 
+       if (*str == ' ')
+               return NULL;
+
        while ((c = *str++) != ' ') {
                if (c < '0' || c > '7')
                        return NULL;
@@ -16,13 +19,16 @@ static const char *get_mode(const char *str, unsigned int *modep)
        return str;
 }
 
-static void decode_tree_entry(struct tree_desc *desc, const void *buf, unsigned long size)
+static void decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned long size)
 {
        const char *path;
        unsigned int mode, len;
 
+       if (size < 24 || buf[size - 21])
+               die("corrupt tree file");
+
        path = get_mode(buf, &mode);
-       if (!path)
+       if (!path || !*path)
                die("corrupt tree file");
        len = strlen(path) + 1;
 
@@ -206,4 +212,3 @@ int get_tree_entry(const unsigned char *tree_sha1, const char *name, unsigned ch
        free(tree);
        return retval;
 }
-