• Jeff King's avatar
    fetch-pack: ignore SIGPIPE in sideband demuxer · 9ff18faf
    Jeff King authored
    If the other side feeds us a bogus pack, index-pack (or
    unpack-objects) may die early, before consuming all of its
    input. As a result, the sideband demuxer may get SIGPIPE
    (racily, depending on whether our data made it into the pipe
    buffer or not). If this happens and we are compiled with
    pthread support, it will take down the main thread, too.
    This isn't the end of the world, as the main process will
    just die() anyway when it sees index-pack failed. But it
    does mean we don't get a chance to say "fatal: index-pack
    failed" or similar. And it also means that we racily fail
    t5504, as we sometimes die() and sometimes are killed by
    So let's ignore SIGPIPE while demuxing the sideband. We are
    already careful to check the return value of write(), so we
    won't waste time writing to a broken pipe. The caller will
    notice the error return from the async thread, though in
    practice we don't even get that far, as we die() as soon as
    we see that index-pack failed.
    The non-sideband case is already fine; we let index-pack
    read straight from the socket, so there is no SIGPIPE at
    all. Technically the non-threaded async case is also OK
    without this (the forked async process gets SIGPIPE), but
    it's not worth distinguishing from the threaded case here.
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
fetch-pack.c 26.7 KB