Skip to content
  • Jeff King's avatar
    tempfile: do not delete tempfile on failed close · 49bd0fc2
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When close_tempfile() fails, we delete the tempfile and
    reset the fields of the tempfile struct. This makes it
    easier for callers to return without cleaning up, but it
    also makes this common pattern:
    
      if (close_tempfile(tempfile))
    	return error_errno("error closing %s", tempfile->filename.buf);
    
    wrong, because the "filename" field has been reset after the
    failed close. And it's not easy to fix, as in many cases we
    don't have another copy of the filename (e.g., if it was
    created via one of the mks_tempfile functions, and we just
    have the original template string).
    
    Let's drop the feature that a failed close automatically
    deletes the file. This puts the burden on the caller to do
    the deletion themselves, but this isn't that big a deal.
    Callers which do:
    
      if (write(...) || close_tempfile(...)) {
    	delete_tempfile(...);
    	return -1;
      }
    
    already had to call delete when the write() failed, and so
    aren't affected. Likewise, any caller which just calls die()
    in the error path is OK; we'll delete the tempfile during
    the atexit handler.
    
    Because this patch changes the semantics of close_tempfile()
    without changing its signature, all callers need to be
    manually checked and converted to the new scheme. This patch
    covers all in-tree callers, but there may be others for
    not-yet-merged topics. To catch these, we rename the
    function to close_tempfile_gently(), which will attract
    compile-time attention to new callers. (Technically the
    original could be considered "gentle" already in that it
    didn't die() on errors, but this one is even more so).
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    49bd0fc2