Skip to content
  • Jeff King's avatar
    has_uncommitted_changes(): fall back to empty tree · 3506dc94
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    If has_uncommitted_changes() can't resolve HEAD (e.g.,
    because it's unborn or corrupt), then we end up calling
    run_diff_index() with an empty revs.pending array. This
    causes a segfault, as run_diff_index() blindly looks at the
    first pending item.
    
    Fixing this raises a question of fault: should
    run_diff_index() handle this case, or is the caller wrong to
    pass an empty pending list?
    
    Looking at the other callers of run_diff_index(), they
    handle this in one of three ways:
    
     - they resolve the object themselves, and avoid doing the
       diff if it's not valid
    
     - they resolve the object themselves, and fall back to the
       empty tree
    
     - they use setup_revisions(), which will die() if the
       object isn't valid
    
    Since this is the only broken caller, that argues that the
    fix should go there. Falling back to the empty tree makes
    sense here, as we'd claim uncommitted changes if and only if
    the index is non-empty. This may be a little funny in the
    case of corruption (the corrupt HEAD probably _isn't_
    empty), but:
    
      - we don't actually know the reason here that HEAD didn't
        resolve (the much more likely case is that we have an
        unborn HEAD, in which case the empty tree comparison is
        the right thing)
    
      - this matches how other code, like "git diff", behaves
    
    While we're thinking about it, let's add an assertion to
    run_diff_index(). It should always be passed a single
    object, and as this bug shows, it's easy to get it wrong
    (and an assertion is easier to hunt down than a segfault, or
    a quietly ignored extra tree).
    
    Reported-by: default avatarÆvar Arnfjörð Bjarmason <avarab@gmail.com>
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    3506dc94