From: Junio C Hamano Date: Tue, 17 May 2016 21:38:34 +0000 (-0700) Subject: Merge branch 'jc/fsck-nul-in-commit' X-Git-Tag: v2.9.0-rc0~23 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/6bfb7de89e32117a59cbafdb2dfeeac633121df0?ds=inline;hp=-c Merge branch 'jc/fsck-nul-in-commit' "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 --- 6bfb7de89e32117a59cbafdb2dfeeac633121df0 diff --combined fsck.c index 92b17f5d6a,3366b3fb62..05315451c5 --- a/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; @@@ -666,9 -668,17 +668,17 @@@ 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; }