• Jeff King's avatar
    link_alt_odb_entry: handle normalize_path errors · 670c359d
    Jeff King authored
    When we add a new alternate to the list, we try to normalize
    out any redundant "..", etc. However, we do not look at the
    return value of normalize_path_copy(), and will happily
    continue with a path that could not be normalized. Worse,
    the normalizing process is done in-place, so we are left
    with whatever half-finished working state the normalizing
    function was in.
    Fortunately, this cannot cause us to read past the end of
    our buffer, as that working state will always leave the
    NUL from the original path in place. And we do tend to
    notice problems when we check is_directory() on the path.
    But you can see the nonsense that we feed to is_directory
    with an entry like:
    in your objects/info/alternates, which yields:
      error: object directory
      does not exist; check .git/objects/info/alternates.
    We can easily fix this just by checking the return value.
    But that makes it hard to generate a good error message,
    since we're normalizing in-place and our input value has
    been overwritten by cruft.
    Instead, let's provide a strbuf helper that does an in-place
    normalize, but restores the original contents on error. This
    uses a second buffer under the hood, which is slightly less
    efficient, but this is not a performance-critical code path.
    The strbuf helper can also properly set the "len" parameter
    of the strbuf before returning. Just doing:
      normalize_path_copy(buf.buf, buf.buf);
    will shorten the string, but leave buf.len at the original
    length. That may be confusing to later code which uses the
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
strbuf.h 19.3 KB