Skip to content
  • Jeff King's avatar
    blame: fix object casting regression · 7cb5f7c4
    Jeff King authored
    Commit 1b0d4000
    
     refactored the prepare_final() function so
    that it could be reused in multiple places. Originally, the
    loop had two outputs: a commit to stuff into sb->final, and
    the name of the commit from the rev->pending array.
    
    After the refactor, that loop is put in its own function
    with a single return value: the object_array_entry from the
    rev->pending array. This contains both the name and the object,
    but with one important difference: the object is the
    _original_ object found by the revision parser, not the
    dereferenced commit. If one feeds a tag to "git blame", we
    end up casting the tag object to a "struct commit", which
    causes a segfault.
    
    Instead, let's return the commit (properly casted) directly
    from the function, and take the "name" as an optional
    out-parameter. This does the right thing, and actually
    simplifies the callers, who no longer need to cast or
    dereference the object_array_entry themselves.
    
    [test case by Max Kirillov <max@max630.net>]
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    7cb5f7c4