Merge branch 'jk/no-null-sha1-in-cache-tree'
authorJunio C Hamano <gitster@pobox.com>
Tue, 16 May 2017 02:51:50 +0000 (11:51 +0900)
committerJunio C Hamano <gitster@pobox.com>
Tue, 16 May 2017 02:51:50 +0000 (11:51 +0900)
Code to update the cache-tree has been tightened so that we won't
accidentally write out any 0{40} entry in the tree object.

* jk/no-null-sha1-in-cache-tree:
cache-tree: reject entries with null sha1

cache-tree.c
read-cache.c
t/t1601-index-bogus.sh [new file with mode: 0755]
t/t7009-filter-branch-null-sha1.sh
index 345ea359638fbdfec874c55d387f9da2399338d2..34baa6d85a1e156a5d01c0e5f9c5f5d2709049ab 100644 (file)
@@ -354,7 +354,9 @@ static int update_one(struct cache_tree *it,
                        entlen = pathlen - baselen;
                        i++;
                }
-               if (mode != S_IFGITLINK && !missing_ok && !has_sha1_file(sha1)) {
+
+               if (is_null_sha1(sha1) ||
+                   (mode != S_IFGITLINK && !missing_ok && !has_sha1_file(sha1))) {
                        strbuf_release(&buffer);
                        if (expected_missing)
                                return -1;
index 0d0081a11b858227d3f55ebbc21f04bd49875f68..3339de812460c903db085dc2be39e4c8b491478f 100644 (file)
@@ -2197,6 +2197,7 @@ static int do_write_index(struct index_state *istate, int newfd,
        int entries = istate->cache_nr;
        struct stat st;
        struct strbuf previous_name_buf = STRBUF_INIT, *previous_name;
+       int drop_cache_tree = 0;
 
        for (i = removed = extended = 0; i < entries; i++) {
                if (cache[i]->ce_flags & CE_REMOVE)
@@ -2247,6 +2248,8 @@ static int do_write_index(struct index_state *istate, int newfd,
                                warning(msg, ce->name);
                        else
                                return error(msg, ce->name);
+
+                       drop_cache_tree = 1;
                }
                if (ce_write_entry(&c, newfd, ce, previous_name) < 0)
                        return -1;
@@ -2265,7 +2268,7 @@ static int do_write_index(struct index_state *istate, int newfd,
                if (err)
                        return -1;
        }
-       if (!strip_extensions && istate->cache_tree) {
+       if (!strip_extensions && !drop_cache_tree && istate->cache_tree) {
                struct strbuf sb = STRBUF_INIT;
 
                cache_tree_write(&sb, istate->cache_tree);
diff --git a/t/t1601-index-bogus.sh b/t/t1601-index-bogus.sh
new file mode 100755 (executable)
index 0000000..73cc932
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+test_description='test handling of bogus index entries'
+. ./test-lib.sh
+
+test_expect_success 'create tree with null sha1' '
+       tree=$(printf "160000 commit $_z40\\tbroken\\n" | git mktree)
+'
+
+test_expect_success 'read-tree refuses to read null sha1' '
+       test_must_fail git read-tree $tree
+'
+
+test_expect_success 'GIT_ALLOW_NULL_SHA1 overrides refusal' '
+       GIT_ALLOW_NULL_SHA1=1 git read-tree $tree
+'
+
+test_expect_success 'git write-tree refuses to write null sha1' '
+       test_must_fail git write-tree
+'
+
+test_done
index c27f90f285faf0529f08fae7262a40b605bd7375..a8d9ec498778b5a597fd5751f811c8bf0b0ab926 100755 (executable)
@@ -31,6 +31,12 @@ test_expect_success 'setup: bring HEAD and index in sync' '
        git commit -a -m "back to normal"
 '
 
+test_expect_success 'noop filter-branch complains' '
+       test_must_fail git filter-branch \
+               --force --prune-empty \
+               --index-filter "true"
+'
+
 test_expect_success 'filter commands are still checked' '
        test_must_fail git filter-branch \
                --force --prune-empty \