for_each_alternate_ref: handle failure from real_pathdup()
commit3a1345af289703a04ff4754f9167ed3cfa2dfdce
authorJeff King <peff@peff.net>
Wed, 8 Feb 2017 20:52:45 +0000 (8 15:52 -0500)
committerJunio C Hamano <gitster@pobox.com>
Wed, 8 Feb 2017 23:39:55 +0000 (8 15:39 -0800)
treed23b071a8bad85195f3e75790ba407997741faa5
parent6e3a7b3398559305c7a239a42e447c21a8f39ff8
for_each_alternate_ref: handle failure from real_pathdup()

In older versions of git, if real_path() failed to resolve
the alternate object store path, we would die() with an
error. However, since 4ac9006f8 (real_path: have callers use
real_pathdup and strbuf_realpath, 2016-12-12) we use the
real_pathdup() function, which may return NULL. Since we
don't check the return value, we can segfault.

This is hard to trigger in practice, since we check that the
path is accessible before creating the alternate_object_database
struct. But it could be removed racily, or we could see a
transient filesystem error.

We could restore the original behavior by switching back to
xstrdup(real_path()).  However, dying is probably not the
best option here. This whole function is best-effort
already; there might not even be a repository around the
shared objects at all. And if the alternate store has gone
away, there are no objects to show.

So let's just quietly return, as we would if we failed to
open "refs/", or if upload-pack failed to start, etc.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
transport.c