• J
    receive-pack: close sideband fd on early pack errors · 49ecfa13
    Jeff King 提交于
    Since commit a22e6f85 (receive-pack: send pack-processing
    stderr over sideband, 2012-09-21), receive-pack will start
    an async sideband thread to copy the stderr from our
    index-pack or unpack-objects child to the client. We hand
    the thread's input descriptor to unpack(), which puts it in
    the "err" member of the "struct child_process".
    
    After unpack() returns, we use finish_async() to reap the
    sideband thread. The thread is only ready to die when it
    gets EOF on its pipe, which is connected to the err
    descriptor. So we expect all of the write ends of that pipe
    to be closed as part of unpack().
    
    Normally, this works fine. After start_command forks, it
    closes the parent copy of the descriptor. Then once the
    child exits (whether it was successful or not), that closes
    the only remaining writer.
    
    However, there is one code-path in unpack() that does not
    handle this. Before we decide which of unpack-objects or
    index-pack to use, we read the pack header ourselves to see
    how many objects it contains. If there is an error here, we
    exit without running either sub-command, the pipe descriptor
    remains open, and we are in a deadlock, waiting for the
    sideband thread to die (which is in turn waiting for us to
    close the pipe).
    
    We can fix this by making sure that unpack() always closes
    the pipe before returning.
    Signed-off-by: NJeff King <peff@peff.net>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    49ecfa13
receive-pack.c 24.6 KB