invalid tree and commit object
- From
- Brandon Williams <bwilliamseng@gmail.com>
- Date
- May 9, 2020, 06:19 UTC
- Message-ID
- <CALN-EhTpiLERuB16-WPZaLub6GdaRHJW8xDeaOEqSFtKe0kCYw@mail.gmail.com>
Hey!
Its been a minute since I've written to the list but I was recently looking into the rules fsck uses to identify valid or invalid objects and I believe I found a case that I believe fsck is currently missing. One of the things fsck looks for when validating a tree object is that it doesn't contain any duplicate entries. It even has a nice comment about how `git-write-tree` used to write out trees with duplicate entries:
/*
* git-write-tree used to write out a nonsense tree that has
* entries with the same name, one blob and one tree. Make
* sure we do not have duplicate entries.
*/Here's the setup:
tree c63d067eaeed0cbc68b7e4fdf40d267c6b152fe8
tree 6241ab2a5314798183b5c4ee8a7b0ccd12c651e6
blob 5e1c309dae7f45e0f39b1bf3ac3cd9db12e7d689 $ git ls-tree c63d067eaeed0cbc68b7e4fdf40d267c6b152fe8
100644 blob 5e1c309dae7f45e0f39b1bf3ac3cd9db12e7d689 hello
100644 blob 5e1c309dae7f45e0f39b1bf3ac3cd9db12e7d689 hello.c
040000 tree 6241ab2a5314798183b5c4ee8a7b0ccd12c651e6 hello $ git ls-tree 6241ab2a5314798183b5c4ee8a7b0ccd12c651e6
100644 blob 5e1c309dae7f45e0f39b1bf3ac3cd9db12e7d689 hello # '%' here indicates that there is no newline at the end of the object
$ git cat-file blob 5e1c309dae7f45e0f39b1bf3ac3cd9db12e7d689
Hello World%fsck currently passes when being passed these objects despite c63d067eae having a duplicate entry. This seems to be due to the duplicate entry check in `fsck_tree` only checking if adjacent entries are duplicates but due to the sorting rules its unable to realize that there is both a blob and a tree with the name "hello".
I was even able to produce a commit and push it to Github[1] (which didn't complain)
$ git show --pretty=raw 62f1ff6e109f8b77edd7eeb65f6634faa76a93b2
commit 62f1ff6e109f8b77edd7eeb65f6634faa76a93b2
tree c63d067eaeed0cbc68b7e4fdf40d267c6b152fe8
author Brandon Williams <bwilliams.eng@gmail.com> 1589004242 -0700
committer Brandon Williams <bwilliams.eng@gmail.com> 1589004242 -0700hello
Checking out that commit leaves your working directory in a somewhat broken and 'unclean' state (although Github's UI seems to be able to handle displaying it properly).
Am I correct in assuming that this object is indeed invalid and should be rejected by fsck?
-Brandon
[1]: https://github.com/bmwill/invalid-commit