Re: [PATCH 2/4] fsck: check rev-index checksums
- From
Taylor Blau <me@ttaylorr.com>
- Date
- Apr 17, 2023, 22:24 UTC
- Message-ID
- <ZD3HI/LIXVv6Pacn@nand.local>
- In-Reply-To
- <7db4ec3e327ed3695f4f5409cb2dc80c72688758.1681748502.git.gitgitgadget@gmail.com>
On Mon, Apr 17, 2023 at 04:21:39PM +0000, Derrick Stolee via GitGitGadget wrote:
Show 5 quoted lines
> @@ -309,6 +310,15 @@ int load_pack_revindex(struct repository *r, struct packed_git *p)
> */
> int verify_pack_revindex(struct packed_git *p)
> {
> + /* Do not bother checking if not initialized. */Yep, makes sense; if we don't have an on-disk reverse index (which is mmap'd into `revindex_map` we don't have anything to verify), so we can bail here.
Show 20 quoted lines
> + if (!p->revindex_map)
> + return 0;
> +
> + if (!hashfile_checksum_valid((const unsigned char *)p->revindex_map, p->revindex_size)) {
> + error(_("invalid checksum"));
> + return -1;
> + }
> +
> return 0;
> }
>
> diff --git a/t/t5325-reverse-index.sh b/t/t5325-reverse-index.sh
> index 206c412f50b..6b7c709a1f6 100755
> --- a/t/t5325-reverse-index.sh
> +++ b/t/t5325-reverse-index.sh
> @@ -145,4 +145,44 @@ test_expect_success 'fsck succeeds on good rev-index' '
> )
> '
>
> +test_expect_success 'set up rev-index corruption tests' 's/set up/setup for easy `--run`-ing (e.g., ./t5325-*.sh --run=setup,fsck).
Show 33 quoted lines
> + git init corrupt &&
> + (
> + cd corrupt &&
> +
> + test_commit commit &&
> + git -c pack.writeReverseIndex=true repack -ad &&
> +
> + revfile=$(ls .git/objects/pack/pack-*.rev) &&
> + chmod a+w $revfile &&
> + cp $revfile $revfile.bak
> + )
> +'
> +
> +corrupt_rev_and_verify () {
> + (
> + pos="$1" &&
> + value="$2" &&
> + error="$3" &&
> +
> + cd corrupt &&
> + revfile=$(ls .git/objects/pack/pack-*.rev) &&
> +
> + # Reset to original rev-file.
> + cp $revfile.bak $revfile &&
> +
> + printf "$value" | dd of=$revfile bs=1 seek="$pos" conv=notrunc &&
> + test_must_fail git fsck 2>err &&
> + grep "$error" err
> + )
> +}
> +
> +test_expect_success 'fsck catches invalid checksum' '
> + revfile=$(ls corrupt/.git/objects/pack/pack-*.rev) &&Would this test be tighter if we introduced a sub-shell and cd'd into "corrupt" here?
> + orig_size=$(wc -c <$revfile) &&
I'm nitpicking, but we may want to use `test_file_size` here instead of `wc -c`. The latter outnumbers the former in terms of number of uses, but I think we consider `test_file_size` to be canonical these days.
> + hashpos=$((orig_size - 10)) && > + corrupt_rev_and_verify $hashpos bogus \ > + "invalid checksum" > +'
This looks good.
Thanks, Taylor