summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2017-03-21 15:03:28 -0700
committerJunio C Hamano <gitster@pobox.com>2017-03-21 15:03:28 -0700
commitf63df942a3f4245970192161dab259922819e3b5 (patch)
treeff1d6a0dc1219487ca8daf7fe6f660574a5d05b9
parent0d9f9424ad12c8e9e71db45776f6bf4a143b90f3 (diff)
parent7e8c9355b7aa61948275c8144dff6857f4b0ee51 (diff)
downloadgit-f63df942a3f4245970192161dab259922819e3b5.tar.gz
Merge branch 'jk/tempfile-ferror-fclose-confusion' into maint
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);
}