summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2017-02-27 13:57:18 -0800
committerJunio C Hamano <gitster@pobox.com>2017-02-27 13:57:18 -0800
commit3f7ebc6ece46f1c23480d094688b8b5f24eb345c (patch)
tree1c03f40032ba3d6af427a10ffd412f368bb01641
parent9720b302479639253518d39ec758241d91275ee6 (diff)
parent7e8c9355b7aa61948275c8144dff6857f4b0ee51 (diff)
downloadgit-3f7ebc6ece46f1c23480d094688b8b5f24eb345c.tar.gz
Merge branch 'jk/tempfile-ferror-fclose-confusion'
A caller of tempfile API that uses stdio interface to write to files may ignore errors while writing, which is detected when tempfile is closed (with a call to ferror()). By that time, the original errno that may have told us what went wrong is likely to be long gone and was overwritten by an irrelevant value. close_tempfile() now resets errno to EIO to make errno at least predictable. * jk/tempfile-ferror-fclose-confusion: tempfile: set errno to a known value before calling ferror()
-rw-r--r--tempfile.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/tempfile.c b/tempfile.c
index ffcc272375..6843710670 100644
--- a/tempfile.c
+++ b/tempfile.c
@@ -247,8 +247,13 @@ int close_tempfile(struct tempfile *tempfile)
tempfile->fd = -1;
if (fp) {
tempfile->fp = NULL;
- err = ferror(fp);
- err |= fclose(fp);
+ if (ferror(fp)) {
+ err = -1;
+ if (!fclose(fp))
+ errno = EIO;
+ } else {
+ err = fclose(fp);
+ }
} else {
err = close(fd);
}