Merge branch 'jc/fsck-nul-in-commit' into maint
"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
This commit is contained in:
commit
f14acabf3a
16
fsck.c
16
fsck.c
@ -59,6 +59,7 @@
|
|||||||
FUNC(HAS_DOTGIT, WARN) \
|
FUNC(HAS_DOTGIT, WARN) \
|
||||||
FUNC(NULL_SHA1, WARN) \
|
FUNC(NULL_SHA1, WARN) \
|
||||||
FUNC(ZERO_PADDED_FILEMODE, WARN) \
|
FUNC(ZERO_PADDED_FILEMODE, WARN) \
|
||||||
|
FUNC(NUL_IN_COMMIT, WARN) \
|
||||||
/* infos (reported as warnings, but ignored by default) */ \
|
/* infos (reported as warnings, but ignored by default) */ \
|
||||||
FUNC(BAD_TAG_NAME, INFO) \
|
FUNC(BAD_TAG_NAME, INFO) \
|
||||||
FUNC(MISSING_TAGGER_ENTRY, INFO)
|
FUNC(MISSING_TAGGER_ENTRY, INFO)
|
||||||
@ -610,6 +611,7 @@ static int fsck_commit_buffer(struct commit *commit, const char *buffer,
|
|||||||
struct commit_graft *graft;
|
struct commit_graft *graft;
|
||||||
unsigned parent_count, parent_line_count = 0, author_count;
|
unsigned parent_count, parent_line_count = 0, author_count;
|
||||||
int err;
|
int err;
|
||||||
|
const char *buffer_begin = buffer;
|
||||||
|
|
||||||
if (verify_headers(buffer, size, &commit->object, options))
|
if (verify_headers(buffer, size, &commit->object, options))
|
||||||
return -1;
|
return -1;
|
||||||
@ -666,9 +668,17 @@ static int fsck_commit_buffer(struct commit *commit, const char *buffer,
|
|||||||
err = fsck_ident(&buffer, &commit->object, options);
|
err = fsck_ident(&buffer, &commit->object, options);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
if (!commit->tree)
|
if (!commit->tree) {
|
||||||
return report(options, &commit->object, FSCK_MSG_BAD_TREE, "could not load commit's tree %s", sha1_to_hex(tree_sha1));
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -427,6 +427,24 @@ test_expect_success 'fsck allows .Ňit' '
|
|||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'NUL in commit' '
|
||||||
|
rm -fr nul-in-commit &&
|
||||||
|
git init nul-in-commit &&
|
||||||
|
(
|
||||||
|
cd nul-in-commit &&
|
||||||
|
git commit --allow-empty -m "initial commitQNUL after message" &&
|
||||||
|
git cat-file commit HEAD >original &&
|
||||||
|
q_to_nul <original >munged &&
|
||||||
|
git hash-object -w -t commit --stdin <munged >name &&
|
||||||
|
git branch bad $(cat name) &&
|
||||||
|
|
||||||
|
test_must_fail git -c fsck.nulInCommit=error fsck 2>warn.1 &&
|
||||||
|
grep nulInCommit warn.1 &&
|
||||||
|
git fsck 2>warn.2 &&
|
||||||
|
grep nulInCommit warn.2
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
# create a static test repo which is broken by omitting
|
# create a static test repo which is broken by omitting
|
||||||
# one particular object ($1, which is looked up via rev-parse
|
# one particular object ($1, which is looked up via rev-parse
|
||||||
# in the new repository).
|
# in the new repository).
|
||||||
|
Loading…
Reference in New Issue
Block a user