From: Johannes Sixt <j.sixt@viscovery.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>,
git@vger.kernel.org, "Jeff King" <peff@peff.net>
Subject: Re: [PATCH v2 2/2] grep: stop looking at random places for .gitattributes
Date: Wed, 17 Oct 2012 09:05:51 +0200 [thread overview]
Message-ID: <507E58CF.2040803@viscovery.net> (raw)
In-Reply-To: <507D010A.8000904@viscovery.net>
Am 10/16/2012 8:39, schrieb Johannes Sixt:
> Am 10/15/2012 18:54, schrieb Junio C Hamano:
>> Ideally, that earlier workaround
>> should have done a logica equivalent of:
>> ...
>> and did so not in-line at the calling site but in a compat/ wrapper
>> for fflush() to eliminate the need for the ifdef.
>
> Fair enough.
>
>>> But reverting the EINVAL check from write_or_die.c is out of question,
>>> because that handles a real case.
>
> Correction: I can't reproduce the error messages that this was working
> around anymore in a brief test. I'll revert the check locally and see what
> happens.
The error is reproducible with this command on Windows:
$ git rev-list HEAD | sed 1q
42b333d8bb8709dfc5783dd4c44bdb6012c2c17d
fatal: write failure on 'stdout': Invalid argument
Let's do as you suggested.
--- 8< ---
From: Johannes Sixt <j6t@kdbg.org>
Subject: [PATCH] maybe_flush_or_die: move a too-loose Windows specific error
check to compat
Commit b2f5e268 (Windows: Work around an oddity when a pipe with no reader
is written to) introduced a check for EINVAL after fflush() to fight
spurious "Invalid argument" errors on Windows when a pipe was broken. But
this check may hide real errors on systems that do not have the this odd
behavior. Introduce an fflush wrapper in compat/mingw.* so that the treatment
is only applied on Windows.
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
compat/mingw.c | 22 ++++++++++++++++++++++
compat/mingw.h | 3 +++
write_or_die.c | 7 +------
3 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index afc892d..4e63838 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -335,6 +335,28 @@ FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream)
return freopen(filename, otype, stream);
}
+#undef fflush
+int mingw_fflush(FILE *stream)
+{
+ int ret = fflush(stream);
+
+ /*
+ * write() is used behind the scenes of stdio output functions.
+ * Since git code does not check for errors after each stdio write
+ * operation, it can happen that write() is called by a later
+ * stdio function even if an earlier write() call failed. In the
+ * case of a pipe whose readable end was closed, only the first
+ * call to write() reports EPIPE on Windows. Subsequent write()
+ * calls report EINVAL. It is impossible to notice whether this
+ * fflush invocation triggered such a case, therefore, we have to
+ * catch all EINVAL errors whole-sale.
+ */
+ if (ret && errno == EINVAL)
+ errno = EPIPE;
+
+ return ret;
+}
+
/*
* The unit of FILETIME is 100-nanoseconds since January 1, 1601, UTC.
* Returns the 100-nanoseconds ("hekto nanoseconds") since the epoch.
diff --git a/compat/mingw.h b/compat/mingw.h
index 61a6521..eeb08d1 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -185,6 +185,9 @@ FILE *mingw_fopen (const char *filename, const char *otype);
FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream);
#define freopen mingw_freopen
+int mingw_fflush(FILE *stream);
+#define fflush mingw_fflush
+
char *mingw_getcwd(char *pointer, int len);
#define getcwd mingw_getcwd
diff --git a/write_or_die.c b/write_or_die.c
index d45b536..960f448 100644
--- a/write_or_die.c
+++ b/write_or_die.c
@@ -34,12 +34,7 @@ void maybe_flush_or_die(FILE *f, const char *desc)
return;
}
if (fflush(f)) {
- /*
- * On Windows, EPIPE is returned only by the first write()
- * after the reading end has closed its handle; subsequent
- * write()s return EINVAL.
- */
- if (errno == EPIPE || errno == EINVAL)
+ if (errno == EPIPE)
exit(0);
die_errno("write failure on '%s'", desc);
}
--
1.8.0.rc2.1248.g3f5b13f
next prev parent reply other threads:[~2012-10-17 7:06 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-09 9:03 'git grep needle rev' attempts to access 'rev:.../.gitattributes' in the worktree Johannes Sixt
2012-10-09 9:38 ` Nguyen Thai Ngoc Duy
2012-10-09 12:01 ` Nguyen Thai Ngoc Duy
2012-10-09 12:41 ` Jeff King
2012-10-09 18:59 ` Junio C Hamano
2012-10-10 5:17 ` Nguyen Thai Ngoc Duy
2012-10-10 5:33 ` Junio C Hamano
2012-10-10 5:45 ` Nguyen Thai Ngoc Duy
2012-10-10 11:34 ` Nguyễn Thái Ngọc Duy
2012-10-10 11:34 ` [PATCH 1/3] quote: let caller reset buffer for quote_path_relative() Nguyễn Thái Ngọc Duy
2012-10-10 21:13 ` Junio C Hamano
2012-10-11 13:04 ` Nguyen Thai Ngoc Duy
2012-10-11 16:42 ` Junio C Hamano
2012-10-10 11:34 ` [PATCH 2/3] grep: pass true path name to grep machinery Nguyễn Thái Ngọc Duy
2012-10-10 11:34 ` [PATCH 3/3] grep: stop looking at random places for .gitattributes Nguyễn Thái Ngọc Duy
2012-10-10 11:51 ` Johannes Sixt
2012-10-10 12:03 ` Nguyen Thai Ngoc Duy
2012-10-10 12:12 ` Johannes Sixt
2012-10-10 12:32 ` Nguyen Thai Ngoc Duy
2012-10-10 12:43 ` Johannes Sixt
2012-10-10 12:51 ` Nguyen Thai Ngoc Duy
2012-10-10 19:44 ` Junio C Hamano
2012-10-11 5:55 ` Johannes Sixt
2012-10-11 7:04 ` Michael Haggerty
2012-10-11 8:17 ` Nguyen Thai Ngoc Duy
2012-10-10 13:59 ` [PATCH v2 0/2] Re: 'git grep needle rev' attempts to access 'rev:.../.gitattributes' in the worktree Nguyễn Thái Ngọc Duy
2012-10-10 13:59 ` [PATCH v2 1/2] quote: let caller reset buffer for quote_path_relative() Nguyễn Thái Ngọc Duy
2012-10-10 13:59 ` [PATCH v2 2/2] grep: stop looking at random places for .gitattributes Nguyễn Thái Ngọc Duy
2012-10-10 14:21 ` Johannes Sixt
2012-10-10 19:56 ` Junio C Hamano
2012-10-11 5:45 ` Johannes Sixt
2012-10-11 15:51 ` Junio C Hamano
2012-10-12 7:33 ` Johannes Sixt
2012-10-14 4:29 ` Junio C Hamano
2012-10-15 6:02 ` Johannes Sixt
2012-10-15 16:54 ` Junio C Hamano
2012-10-16 6:39 ` Johannes Sixt
2012-10-17 7:05 ` Johannes Sixt [this message]
2012-10-17 7:33 ` Junio C Hamano
2012-10-11 1:49 ` Nguyen Thai Ngoc Duy
2012-10-11 3:15 ` Junio C Hamano
2012-10-12 10:49 ` [PATCH v3] " Nguyễn Thái Ngọc Duy
2012-10-12 16:47 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=507E58CF.2040803@viscovery.net \
--to=j.sixt@viscovery.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pclouds@gmail.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).