1. 29 4月, 2013 3 次提交
  2. 27 4月, 2013 14 次提交
  3. 25 4月, 2013 6 次提交
  4. 23 4月, 2013 15 次提交
  5. 22 4月, 2013 1 次提交
  6. 20 4月, 2013 1 次提交
    • 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