diff options
-rw-r--r-- | sha1_file.c | 5 | ||||
-rwxr-xr-x | t/t1450-fsck.sh | 22 |
2 files changed, 27 insertions, 0 deletions
diff --git a/sha1_file.c b/sha1_file.c index ca1c90e5d3..b2c6648085 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -3847,6 +3847,11 @@ static int check_stream_sha1(git_zstream *stream, error("corrupt loose object '%s'", sha1_to_hex(expected_sha1)); return -1; } + if (stream->avail_in) { + error("garbage at end of loose object '%s'", + sha1_to_hex(expected_sha1)); + return -1; + } git_SHA1_Final(real_sha1, &c); if (hashcmp(expected_sha1, real_sha1)) { diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index 455c186fe2..8975b4d1bc 100755 --- a/t/t1450-fsck.sh +++ b/t/t1450-fsck.sh @@ -597,4 +597,26 @@ test_expect_success 'fsck finds problems in duplicate loose objects' ' ) ' +test_expect_success 'fsck detects trailing loose garbage (commit)' ' + git cat-file commit HEAD >basis && + echo bump-commit-sha1 >>basis && + commit=$(git hash-object -w -t commit basis) && + file=$(sha1_file $commit) && + test_when_finished "remove_object $commit" && + chmod +w "$file" && + echo garbage >>"$file" && + test_must_fail git fsck 2>out && + test_i18ngrep "garbage.*$commit" out +' + +test_expect_success 'fsck detects trailing loose garbage (blob)' ' + blob=$(echo trailing | git hash-object -w --stdin) && + file=$(sha1_file $blob) && + test_when_finished "remove_object $blob" && + chmod +w "$file" && + echo garbage >>"$file" && + test_must_fail git fsck 2>out && + test_i18ngrep "garbage.*$blob" out +' + test_done |