branch: fix segfault when resolving an invalid HEAD
[gitweb.git] / builtin-read-tree.c
index 8ba436dbace7ec25ec5768a5c6c84f3202f92159..793eae0a5f4cc3d21788a3642f156410ce1ad89d 100644 (file)
@@ -55,8 +55,7 @@ static void prime_cache_tree_rec(struct cache_tree *it, struct tree *tree)
        int cnt;
 
        hashcpy(it->sha1, tree->object.sha1);
-       desc.buf = tree->buffer;
-       desc.size = tree->size;
+       init_tree_desc(&desc, tree->buffer, tree->size);
        cnt = 0;
        while (tree_entry(&desc, &entry)) {
                if (!S_ISDIR(entry.mode))
@@ -133,7 +132,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
                 *  entries and put the entries from the tree under the
                 * given subdirectory.
                 */
-               if (!strncmp(arg, "--prefix=", 9)) {
+               if (!prefixcmp(arg, "--prefix=")) {
                        if (stage || opts.merge || opts.prefix)
                                usage(read_tree_usage);
                        opts.prefix = arg + 9;
@@ -179,13 +178,13 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
                        continue;
                }
 
-               if (!strncmp(arg, "--exclude-per-directory=", 24)) {
+               if (!prefixcmp(arg, "--exclude-per-directory=")) {
                        struct dir_struct *dir;
 
                        if (opts.dir)
                                die("more than one --exclude-per-directory are given.");
 
-                       dir = calloc(1, sizeof(*opts.dir));
+                       dir = xcalloc(1, sizeof(*opts.dir));
                        dir->show_ignored = 1;
                        dir->exclude_per_dir = arg + 24;
                        opts.dir = dir;