From: Jim Meyering <meyering@redhat.com>
Date: Sat, 24 Sep 2011 09:22:06 +0000 (+0200)
Subject: do not ignore write error for any output size
X-Git-Tag: emacs-pretest-24.0.90~28
X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b260039d4257fae4594fbf13bc116ed154dec111;p=emacs.git

do not ignore write error for any output size

The previous change was incomplete.
While it makes emacs --batch detect the vast majority of stdout
write failures, errors were still ignored whenever the output size is
k * (BUFSIZ+1) - 4.  E.g., on a system with BUFSIZ of 4096,
  $ emacs --batch --eval '(print (format "%4093d" 0))' > /dev/full \
      && echo FAIL: ignored write error
  FAIL: ignored write error
  $ emacs --batch --eval '(print (format "%20481d" 0))' > /dev/full \
      && echo FAIL: ignored write error
  FAIL: ignored write error
* emacs.c (Fkill_emacs): Also test ferror.  (Bug#9574)
---

diff --git a/src/ChangeLog b/src/ChangeLog
index 44a76068313..7435254b490 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,18 @@
+2011-09-24  Jim Meyering  <meyering@redhat.com>
+
+	do not ignore write error for any output size
+	The previous change was incomplete.
+	While it makes emacs --batch detect the vast majority of stdout
+	write failures, errors were still ignored whenever the output size is
+	k * (BUFSIZ+1) - 4.  E.g., on a system with BUFSIZ of 4096,
+	  $ emacs --batch --eval '(print (format "%4093d" 0))' > /dev/full \
+	      && echo FAIL: ignored write error
+	  FAIL: ignored write error
+	  $ emacs --batch --eval '(print (format "%20481d" 0))' > /dev/full \
+	      && echo FAIL: ignored write error
+	  FAIL: ignored write error
+	* emacs.c (Fkill_emacs): Also test ferror.  (Bug#9574)
+
 2011-09-23  Andreas Schwab  <schwab@linux-m68k.org>
 
 	* emacs.c (Fkill_emacs): In noninteractive mode exit
diff --git a/src/emacs.c b/src/emacs.c
index 0a684d4423c..073156bb0c9 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -2019,7 +2019,7 @@ all of which are called before Emacs is actually killed.  */)
     unlink (SSDATA (Vauto_save_list_file_name));
 
   exit_code = EXIT_SUCCESS;
-  if (noninteractive && fflush (stdout))
+  if (noninteractive && (fflush (stdout) || ferror (stdout)))
     exit_code = EXIT_FAILURE;
   exit (INTEGERP (arg) ? XINT (arg) : exit_code);
 }