https://github.com/git/git
Revision 8d2244ba74f5207b9f7f9f1b4efbcccacbbb2c7b authored by Andy Parkins on 02 July 2007, 12:56:58 UTC, committed by Junio C Hamano on 02 July 2007, 23:41:18 UTC
I ran git-prune on a repository and got this:

 $ git-prune
 error: Object 228f8065b930120e35fc0c154c237487ab02d64a is a blob, not a commit
 Segmentation fault (core dumped)

This repository was a strange one in that it was being used to provide
its own submodule.  That is, the repository was cloned into a
subdirectory, an independent branch checked out in that subdirectory,
and then it was marked as a submodule.  git-prune then failed in the
above manner.

The problem was that git-prune was not submodule aware in two areas.

Linus said:

 > So what happens is that something traverses a tree object, looks at each
 > entry, sees that it's not a tree, and tries to look it up as a blob. But
 > subprojects are commits, not blobs, and then when you look at the object
 > more closely, you get the above kind of object type confusion.

and included a patch to add an S_ISGITLINK() test to reachable.c's
process_tree() function.  That fixed the first git-prune error, and
stopped it from trying to process the gitlink entries in trees as if
they were pointers to other trees (and of course failing, because
gitlinks _aren't_ trees).  That part of this patch is his.

The second area is add_cache_refs().  This is called before starting the
reachability analysis, and was calling lookup_blob() on every object
hash found in the index.  However, it is no longer true that every hash
in the index is a pointer to a blob, some of them are gitlinks, and are
not backed by any object at all, they are commits in another repository.
Normally this bug was not causing any problems, but in the case of the
self-referencing repository described above, it meant that the gitlink
hash was being marked as being of type OBJ_BLOB by add_cache_refs() call
to lookup_blob().  Then later, because that hash was also pointed to by
a ref, add_one_ref() would treat it as a commit; lookup_commit() would
return a NULL because that object was already noted as being an
OBJ_BLOB, not an OBJ_COMMIT; and parse_commit_buffer() would SEGFAULT on
that NULL pointer.

The fix made by this patch is to not blindly call lookup_blob() in
reachable.c's add_cache_refs(), and instead skip any index entries that
are S_ISGITLINK().

Signed-off-by: Andy Parkins <andyparkins@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 5788744
History
Tip revision: 8d2244ba74f5207b9f7f9f1b4efbcccacbbb2c7b authored by Andy Parkins on 02 July 2007, 12:56:58 UTC
Make git-prune submodule aware (and fix a SEGFAULT in the process)
Tip revision: 8d2244b
File Mode Size
Documentation
arm
compat
contrib
git-gui
gitweb
mozilla-sha1
perl
ppc
t
templates
xdiff
.gitignore -rw-r--r-- 2.2 KB
.mailmap -rw-r--r-- 1.7 KB
COPYING -rw-r--r-- 18.3 KB
GIT-VERSION-GEN -rwxr-xr-x 759 bytes
INSTALL -rw-r--r-- 4.1 KB
Makefile -rw-r--r-- 31.8 KB
README -rw-r--r-- 2.1 KB
RelNotes l--------- 34 bytes
alloc.c -rw-r--r-- 1.7 KB
archive-tar.c -rw-r--r-- 8.2 KB
archive-zip.c -rw-r--r-- 8.9 KB
archive.h -rw-r--r-- 1.1 KB
attr.c -rw-r--r-- 13.2 KB
attr.h -rw-r--r-- 816 bytes
base85.c -rw-r--r-- 2.9 KB
blob.c -rw-r--r-- 1.1 KB
blob.h -rw-r--r-- 311 bytes
builtin-add.c -rw-r--r-- 6.0 KB
builtin-annotate.c -rw-r--r-- 447 bytes
builtin-apply.c -rw-r--r-- 69.0 KB
builtin-archive.c -rw-r--r-- 5.7 KB
builtin-blame.c -rw-r--r-- 60.8 KB
builtin-branch.c -rw-r--r-- 16.3 KB
builtin-bundle.c -rw-r--r-- 9.8 KB
builtin-cat-file.c -rw-r--r-- 3.4 KB
builtin-check-attr.c -rw-r--r-- 1.3 KB
builtin-check-ref-format.c -rw-r--r-- 282 bytes
builtin-checkout-index.c -rw-r--r-- 7.5 KB
builtin-commit-tree.c -rw-r--r-- 3.9 KB
builtin-config.c -rw-r--r-- 6.0 KB
builtin-count-objects.c -rw-r--r-- 2.9 KB
builtin-describe.c -rw-r--r-- 6.6 KB
builtin-diff-files.c -rw-r--r-- 958 bytes
builtin-diff-index.c -rw-r--r-- 1.2 KB
builtin-diff-tree.c -rw-r--r-- 3.3 KB
builtin-diff.c -rw-r--r-- 8.2 KB
builtin-fetch--tool.c -rw-r--r-- 12.8 KB
builtin-fmt-merge-msg.c -rw-r--r-- 7.8 KB
builtin-for-each-ref.c -rw-r--r-- 20.6 KB
builtin-fsck.c -rw-r--r-- 16.6 KB
builtin-gc.c -rw-r--r-- 1.8 KB
builtin-grep.c -rw-r--r-- 16.4 KB
builtin-init-db.c -rw-r--r-- 8.8 KB
builtin-log.c -rw-r--r-- 18.7 KB
builtin-ls-files.c -rw-r--r-- 12.1 KB
builtin-ls-tree.c -rw-r--r-- 3.8 KB
builtin-mailinfo.c -rw-r--r-- 18.2 KB
builtin-mailsplit.c -rw-r--r-- 4.1 KB
builtin-merge-base.c -rw-r--r-- 1.2 KB
builtin-merge-file.c -rw-r--r-- 1.5 KB
builtin-mv.c -rw-r--r-- 7.4 KB
builtin-name-rev.c -rw-r--r-- 6.1 KB
builtin-pack-objects.c -rw-r--r-- 44.4 KB
builtin-pack-refs.c -rw-r--r-- 2.9 KB
builtin-prune-packed.c -rw-r--r-- 1.8 KB
builtin-prune.c -rw-r--r-- 1.9 KB
builtin-push.c -rw-r--r-- 8.9 KB
builtin-read-tree.c -rw-r--r-- 6.6 KB
builtin-reflog.c -rw-r--r-- 9.8 KB
builtin-rerere.c -rw-r--r-- 10.5 KB
builtin-rev-list.c -rw-r--r-- 13.1 KB
builtin-rev-parse.c -rw-r--r-- 7.8 KB
builtin-revert.c -rw-r--r-- 10.0 KB
builtin-rm.c -rw-r--r-- 5.6 KB
builtin-runstatus.c -rw-r--r-- 812 bytes
builtin-shortlog.c -rw-r--r-- 7.4 KB
builtin-show-branch.c -rw-r--r-- 21.1 KB
builtin-show-ref.c -rw-r--r-- 5.7 KB
builtin-stripspace.c -rw-r--r-- 1012 bytes
builtin-symbolic-ref.c -rw-r--r-- 1.3 KB
builtin-tar-tree.c -rw-r--r-- 2.1 KB
builtin-unpack-objects.c -rw-r--r-- 8.6 KB
builtin-update-index.c -rw-r--r-- 19.1 KB
builtin-update-ref.c -rw-r--r-- 1.5 KB
builtin-upload-archive.c -rw-r--r-- 4.1 KB
builtin-verify-pack.c -rw-r--r-- 1.7 KB
builtin-write-tree.c -rw-r--r-- 2.1 KB
builtin.h -rw-r--r-- 5.7 KB
cache-tree.c -rw-r--r-- 12.5 KB
cache-tree.h -rw-r--r-- 921 bytes
cache.h -rw-r--r-- 20.1 KB
check-builtins.sh -rwxr-xr-x 588 bytes
check-racy.c -rw-r--r-- 517 bytes
color.c -rw-r--r-- 3.2 KB
color.h -rw-r--r-- 376 bytes
combine-diff.c -rw-r--r-- 26.4 KB
commit.c -rw-r--r-- 33.1 KB
commit.h -rw-r--r-- 3.8 KB
config.c -rw-r--r-- 21.1 KB
config.mak.in -rw-r--r-- 932 bytes
configure.ac -rw-r--r-- 12.0 KB
connect.c -rw-r--r-- 17.1 KB
convert-objects.c -rw-r--r-- 7.3 KB
convert.c -rw-r--r-- 14.9 KB
copy.c -rw-r--r-- 689 bytes
csum-file.c -rw-r--r-- 3.1 KB
csum-file.h -rw-r--r-- 686 bytes
ctype.c -rw-r--r-- 890 bytes
daemon.c -rw-r--r-- 26.2 KB
date.c -rw-r--r-- 17.8 KB
decorate.c -rw-r--r-- 1.8 KB
decorate.h -rw-r--r-- 382 bytes
delta.h -rw-r--r-- 3.2 KB
diff-delta.c -rw-r--r-- 13.8 KB
diff-lib.c -rw-r--r-- 17.0 KB
diff.c -rw-r--r-- 75.5 KB
diff.h -rw-r--r-- 7.1 KB
diffcore-break.c -rw-r--r-- 8.5 KB
diffcore-delta.c -rw-r--r-- 5.1 KB
diffcore-order.c -rw-r--r-- 2.2 KB
diffcore-pickaxe.c -rw-r--r-- 3.3 KB
diffcore-rename.c -rw-r--r-- 13.0 KB
diffcore.h -rw-r--r-- 3.7 KB
dir.c -rw-r--r-- 14.3 KB
dir.h -rw-r--r-- 1.7 KB
dump-cache-tree.c -rw-r--r-- 1.5 KB
entry.c -rw-r--r-- 5.1 KB
environment.c -rw-r--r-- 2.7 KB
exec_cmd.c -rw-r--r-- 2.8 KB
exec_cmd.h -rw-r--r-- 286 bytes
fast-import.c -rw-r--r-- 51.4 KB
fetch-pack.c -rw-r--r-- 17.6 KB
fetch.c -rw-r--r-- 6.7 KB
fetch.h -rw-r--r-- 1.6 KB
generate-cmdlist.sh -rwxr-xr-x 544 bytes
git-add--interactive.perl -rwxr-xr-x 15.9 KB
git-am.sh -rwxr-xr-x 11.1 KB
git-applymbox.sh -rwxr-xr-x 2.9 KB
git-applypatch.sh -rwxr-xr-x 5.4 KB
git-archimport.perl -rwxr-xr-x 36.1 KB
git-bisect.sh -rwxr-xr-x 8.3 KB
git-checkout.sh -rwxr-xr-x 6.9 KB
git-clean.sh -rwxr-xr-x 1.8 KB
git-clone.sh -rwxr-xr-x 9.9 KB
git-commit.sh -rwxr-xr-x 14.1 KB
git-compat-util.h -rw-r--r-- 7.7 KB
git-cvsexportcommit.perl -rwxr-xr-x 8.1 KB
git-cvsimport.perl -rwxr-xr-x 26.5 KB
git-cvsserver.perl -rwxr-xr-x 96.1 KB
git-fetch.sh -rwxr-xr-x 8.8 KB
git-instaweb.sh -rwxr-xr-x 5.2 KB
git-lost-found.sh -rwxr-xr-x 473 bytes
git-ls-remote.sh -rwxr-xr-x 2.5 KB
git-merge-octopus.sh -rwxr-xr-x 2.4 KB
git-merge-one-file.sh -rwxr-xr-x 3.1 KB
git-merge-ours.sh -rwxr-xr-x 335 bytes
git-merge-resolve.sh -rwxr-xr-x 956 bytes
git-merge-stupid.sh -rwxr-xr-x 1.4 KB
git-merge.sh -rwxr-xr-x 10.9 KB
git-mergetool.sh -rwxr-xr-x 7.7 KB
git-p4import.py -rw-r--r-- 10.5 KB
git-parse-remote.sh -rwxr-xr-x 5.8 KB
git-pull.sh -rwxr-xr-x 3.2 KB
git-quiltimport.sh -rwxr-xr-x 3.0 KB
git-rebase.sh -rwxr-xr-x 8.3 KB
git-relink.perl -rwxr-xr-x 4.0 KB
git-remote.perl -rwxr-xr-x 8.9 KB
git-repack.sh -rwxr-xr-x 2.6 KB
git-request-pull.sh -rwxr-xr-x 1.3 KB
git-reset.sh -rwxr-xr-x 2.3 KB
git-send-email.perl -rwxr-xr-x 16.8 KB
git-sh-setup.sh -rwxr-xr-x 1.7 KB
git-svn.perl -rwxr-xr-x 111.7 KB
git-svnimport.perl -rwxr-xr-x 24.7 KB
git-tag.sh -rwxr-xr-x 3.1 KB
git-verify-tag.sh -rwxr-xr-x 741 bytes
git.c -rw-r--r-- 10.8 KB
git.spec.in -rw-r--r-- 8.3 KB
gitk -rwxr-xr-x 172.5 KB
grep.c -rw-r--r-- 12.7 KB
grep.h -rw-r--r-- 1.6 KB
hash-object.c -rw-r--r-- 1.9 KB
help.c -rw-r--r-- 4.6 KB
http-fetch.c -rw-r--r-- 25.9 KB
http-push.c -rw-r--r-- 66.5 KB
http.c -rw-r--r-- 11.4 KB
http.h -rw-r--r-- 2.5 KB
ident.c -rw-r--r-- 5.6 KB
imap-send.c -rw-r--r-- 28.5 KB
index-pack.c -rw-r--r-- 25.1 KB
interpolate.c -rw-r--r-- 2.1 KB
interpolate.h -rw-r--r-- 589 bytes
list-objects.c -rw-r--r-- 4.5 KB
list-objects.h -rw-r--r-- 382 bytes
local-fetch.c -rw-r--r-- 6.0 KB
lockfile.c -rw-r--r-- 2.1 KB
log-tree.c -rw-r--r-- 9.8 KB
log-tree.h -rw-r--r-- 386 bytes
mailmap.c -rw-r--r-- 2.2 KB
mailmap.h -rw-r--r-- 213 bytes
match-trees.c -rw-r--r-- 7.1 KB
merge-file.c -rw-r--r-- 2.3 KB
merge-index.c -rw-r--r-- 2.4 KB
merge-recursive.c -rw-r--r-- 44.2 KB
merge-tree.c -rw-r--r-- 7.9 KB
mktag.c -rw-r--r-- 3.9 KB
mktree.c -rw-r--r-- 3.1 KB
object-refs.c -rw-r--r-- 2.0 KB
object.c -rw-r--r-- 5.5 KB
object.h -rw-r--r-- 2.3 KB
pack-check.c -rw-r--r-- 4.2 KB
pack-redundant.c -rw-r--r-- 14.8 KB
pack-write.c -rw-r--r-- 1020 bytes
pack.h -rw-r--r-- 1.6 KB
pager.c -rw-r--r-- 1.1 KB
patch-delta.c -rw-r--r-- 2.2 KB
patch-id.c -rw-r--r-- 1.6 KB
patch-ids.c -rw-r--r-- 4.7 KB
patch-ids.h -rw-r--r-- 490 bytes
path-list.c -rw-r--r-- 2.2 KB
path-list.h -rw-r--r-- 597 bytes
path.c -rw-r--r-- 6.1 KB
peek-remote.c -rw-r--r-- 1.4 KB
pkt-line.c -rw-r--r-- 2.5 KB
pkt-line.h -rw-r--r-- 348 bytes
progress.c -rw-r--r-- 2.5 KB
progress.h -rw-r--r-- 591 bytes
quote.c -rw-r--r-- 8.1 KB
quote.h -rw-r--r-- 2.1 KB
reachable.c -rw-r--r-- 5.5 KB
reachable.h -rw-r--r-- 127 bytes
read-cache.c -rw-r--r-- 27.3 KB
receive-pack.c -rw-r--r-- 12.1 KB
reflog-walk.c -rw-r--r-- 6.7 KB
reflog-walk.h -rw-r--r-- 384 bytes
refs.c -rw-r--r-- 33.8 KB
refs.h -rw-r--r-- 2.4 KB
revision.c -rw-r--r-- 35.8 KB
revision.h -rw-r--r-- 3.3 KB
rsh.c -rw-r--r-- 1.7 KB
rsh.h -rw-r--r-- 159 bytes
run-command.c -rw-r--r-- 2.7 KB
run-command.h -rw-r--r-- 842 bytes
send-pack.c -rw-r--r-- 9.2 KB
server-info.c -rw-r--r-- 5.1 KB
setup.c -rw-r--r-- 6.7 KB
sha1_file.c -rw-r--r-- 59.0 KB
sha1_name.c -rw-r--r-- 16.0 KB
shallow.c -rw-r--r-- 2.3 KB
shell.c -rw-r--r-- 1.1 KB
show-index.c -rw-r--r-- 2.1 KB
sideband.c -rw-r--r-- 1.9 KB
sideband.h -rw-r--r-- 335 bytes
ssh-fetch.c -rw-r--r-- 3.6 KB
ssh-pull.c -rw-r--r-- 154 bytes
ssh-push.c -rw-r--r-- 155 bytes
ssh-upload.c -rw-r--r-- 2.8 KB
strbuf.c -rw-r--r-- 768 bytes
strbuf.h -rw-r--r-- 216 bytes
symlinks.c -rw-r--r-- 862 bytes
tag.c -rw-r--r-- 2.8 KB
tag.h -rw-r--r-- 471 bytes
tar.h -rw-r--r-- 644 bytes
test-chmtime.c -rw-r--r-- 1.2 KB
test-date.c -rw-r--r-- 378 bytes
test-delta.c -rw-r--r-- 1.8 KB
test-genrandom.c -rw-r--r-- 731 bytes
test-match-trees.c -rw-r--r-- 588 bytes
test-sha1.c -rw-r--r-- 815 bytes
test-sha1.sh -rwxr-xr-x 1.9 KB
trace.c -rw-r--r-- 3.9 KB
tree-diff.c -rw-r--r-- 8.7 KB
tree-walk.c -rw-r--r-- 4.3 KB
tree-walk.h -rw-r--r-- 1.2 KB
tree.c -rw-r--r-- 5.5 KB
tree.h -rw-r--r-- 860 bytes
unpack-file.c -rw-r--r-- 821 bytes
unpack-trees.c -rw-r--r-- 20.4 KB
unpack-trees.h -rw-r--r-- 900 bytes
update-server-info.c -rw-r--r-- 457 bytes
upload-pack.c -rw-r--r-- 16.3 KB
usage.c -rw-r--r-- 1.9 KB
utf8.c -rw-r--r-- 9.9 KB
utf8.h -rw-r--r-- 388 bytes
var.c -rw-r--r-- 1.3 KB
write_or_die.c -rw-r--r-- 1.3 KB
wt-status.c -rw-r--r-- 9.3 KB
wt-status.h -rw-r--r-- 566 bytes
xdiff-interface.c -rw-r--r-- 2.8 KB
xdiff-interface.h -rw-r--r-- 559 bytes

README

back to top