Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Commits on Jul 2, 2007
  1. @andyparkins @gitster

    Make git-prune submodule aware (and fix a SEGFAULT in the process)

    andyparkins authored gitster committed
    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>
Something went wrong with that request. Please try again.