Merge branch 'jc/fsck-nul-in-commit'
authorJunio C Hamano <gitster@pobox.com>
Tue, 17 May 2016 21:38:34 +0000 (14:38 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 17 May 2016 21:38:34 +0000 (14:38 -0700)
"git fsck" learned to catch NUL byte in a commit object as
potential error and warn.

* jc/fsck-nul-in-commit:
fsck: detect and warn a commit with embedded NUL
fsck_commit_buffer(): do not special case the last validation

1  2 
fsck.c
diff --combined fsck.c
index 92b17f5d6adb98499eb57f95d098688d2f96a2f7,3366b3fb620fddaf542d7c23e1f6c1c564f8fbe8..05315451c56fe19b2a2e8663d1f4847070bc946f
--- 1/fsck.c
--- 2/fsck.c
+++ b/fsck.c
@@@ -59,6 -59,7 +59,7 @@@
        FUNC(HAS_DOTGIT, WARN) \
        FUNC(NULL_SHA1, WARN) \
        FUNC(ZERO_PADDED_FILEMODE, WARN) \
+       FUNC(NUL_IN_COMMIT, WARN) \
        /* infos (reported as warnings, but ignored by default) */ \
        FUNC(BAD_TAG_NAME, INFO) \
        FUNC(MISSING_TAGGER_ENTRY, INFO)
@@@ -312,9 -313,9 +313,9 @@@ static int fsck_walk_tree(struct tree *
                if (S_ISGITLINK(entry.mode))
                        continue;
                if (S_ISDIR(entry.mode))
 -                      result = options->walk(&lookup_tree(entry.sha1)->object, OBJ_TREE, data, options);
 +                      result = options->walk(&lookup_tree(entry.oid->hash)->object, OBJ_TREE, data, options);
                else if (S_ISREG(entry.mode) || S_ISLNK(entry.mode))
 -                      result = options->walk(&lookup_blob(entry.sha1)->object, OBJ_BLOB, data, options);
 +                      result = options->walk(&lookup_blob(entry.oid->hash)->object, OBJ_BLOB, data, options);
                else {
                        result = error("in tree %s: entry %s has bad mode %.6o",
                                        oid_to_hex(&tree->object.oid), entry.path, entry.mode);
@@@ -450,11 -451,11 +451,11 @@@ static int fsck_tree(struct tree *item
        while (desc.size) {
                unsigned mode;
                const char *name;
 -              const unsigned char *sha1;
 +              const struct object_id *oid;
  
 -              sha1 = tree_entry_extract(&desc, &name, &mode);
 +              oid = tree_entry_extract(&desc, &name, &mode);
  
 -              has_null_sha1 |= is_null_sha1(sha1);
 +              has_null_sha1 |= is_null_oid(oid);
                has_full_path |= !!strchr(name, '/');
                has_empty_name |= !*name;
                has_dot |= !strcmp(name, ".");
@@@ -610,6 -611,7 +611,7 @@@ static int fsck_commit_buffer(struct co
        struct commit_graft *graft;
        unsigned parent_count, parent_line_count = 0, author_count;
        int err;
+       const char *buffer_begin = buffer;
  
        if (verify_headers(buffer, size, &commit->object, options))
                return -1;
        err = fsck_ident(&buffer, &commit->object, options);
        if (err)
                return err;
-       if (!commit->tree)
-               return report(options, &commit->object, FSCK_MSG_BAD_TREE, "could not load commit's tree %s", sha1_to_hex(tree_sha1));
+       if (!commit->tree) {
+               err = report(options, &commit->object, FSCK_MSG_BAD_TREE, "could not load commit's tree %s", sha1_to_hex(tree_sha1));
+               if (err)
+                       return err;
+       }
+       if (memchr(buffer_begin, '\0', size)) {
+               err = report(options, &commit->object, FSCK_MSG_NUL_IN_COMMIT,
+                            "NUL byte in the commit object body");
+               if (err)
+                       return err;
+       }
        return 0;
  }