6c1aee8
commit 1e9104c18019e7dc6b5590aea4b1d4f9d8ecfd56
6c1aee8
Author: Bruno Haible <bruno@clisp.org>
6c1aee8
Date:   Sat Apr 7 12:21:04 2018 +0200
6c1aee8
6c1aee8
    Fix check of return value of fwrite().
6c1aee8
    
6c1aee8
    * src/patch.c (copy_till): Consider incomplete fwrite() write as an error.
6c1aee8
    * src/pch.c (pch_write_line, do_ed_script): Likewise.
6c1aee8
6c1aee8
diff --git a/src/patch.c b/src/patch.c
6c1aee8
index 1ae91d9..3fcaec5 100644
6c1aee8
--- a/src/patch.c
6c1aee8
+++ b/src/patch.c
6c1aee8
@@ -2,7 +2,7 @@
6c1aee8
 
6c1aee8
 /* Copyright (C) 1984, 1985, 1986, 1987, 1988 Larry Wall
6c1aee8
 
6c1aee8
-   Copyright (C) 1989-1993, 1997-1999, 2002-2003, 2006, 2009-2012 Free Software
6c1aee8
+   Copyright (C) 1989-1993, 1997-1999, 2002-2003, 2006, 2009-2018 Free Software
6c1aee8
    Foundation, Inc.
6c1aee8
 
6c1aee8
    This program is free software: you can redistribute it and/or modify
6c1aee8
@@ -1641,7 +1641,7 @@ copy_till (struct outstate *outstate, lin lastline)
6c1aee8
 	if (size)
6c1aee8
 	  {
6c1aee8
 	    if ((! outstate->after_newline  &&  putc ('\n', fp) == EOF)
6c1aee8
-		|| ! fwrite (s, sizeof *s, size, fp))
6c1aee8
+		|| fwrite (s, sizeof *s, size, fp) < size)
6c1aee8
 	      write_fatal ();
6c1aee8
 	    outstate->after_newline = s[size - 1] == '\n';
6c1aee8
 	    outstate->zero_output = false;
6c1aee8
diff --git a/src/pch.c b/src/pch.c
6c1aee8
index cda3dfa..79a3c99 100644
6c1aee8
--- a/src/pch.c
6c1aee8
+++ b/src/pch.c
6c1aee8
@@ -2279,8 +2279,11 @@ pfetch (lin line)
6c1aee8
 bool
6c1aee8
 pch_write_line (lin line, FILE *file)
6c1aee8
 {
6c1aee8
-  bool after_newline = (p_len[line] > 0) && (p_line[line][p_len[line] - 1] == '\n');
6c1aee8
-  if (! fwrite (p_line[line], sizeof (*p_line[line]), p_len[line], file))
6c1aee8
+  bool after_newline =
6c1aee8
+    (p_len[line] > 0) && (p_line[line][p_len[line] - 1] == '\n');
6c1aee8
+
6c1aee8
+  if (fwrite (p_line[line], sizeof (*p_line[line]), p_len[line], file)
6c1aee8
+      < p_len[line])
6c1aee8
     write_fatal ();
6c1aee8
   return after_newline;
6c1aee8
 }
6c1aee8
@@ -2427,13 +2430,14 @@ do_ed_script (char const *inname, char const *outname,
6c1aee8
 	ed_command_letter = get_ed_command_letter (buf);
6c1aee8
 	if (ed_command_letter) {
6c1aee8
 	    if (tmpfp)
6c1aee8
-		if (! fwrite (buf, sizeof *buf, chars_read, tmpfp))
6c1aee8
+		if (fwrite (buf, sizeof *buf, chars_read, tmpfp) < chars_read)
6c1aee8
 		    write_fatal ();
6c1aee8
 	    if (ed_command_letter != 'd' && ed_command_letter != 's') {
6c1aee8
 	        p_pass_comments_through = true;
6c1aee8
 		while ((chars_read = get_line ()) != 0) {
6c1aee8
 		    if (tmpfp)
6c1aee8
-			if (! fwrite (buf, sizeof *buf, chars_read, tmpfp))
6c1aee8
+			if (fwrite (buf, sizeof *buf, chars_read, tmpfp)
6c1aee8
+			    < chars_read)
6c1aee8
 			    write_fatal ();
6c1aee8
 		    if (chars_read == 2  &&  strEQ (buf, ".\n"))
6c1aee8
 			break;
6c1aee8
@@ -2448,7 +2452,7 @@ do_ed_script (char const *inname, char const *outname,
6c1aee8
     }
6c1aee8
     if (dry_run || skip_rest_of_patch)
6c1aee8
       return;
6c1aee8
-    if (fwrite ("w\nq\n", sizeof (char), (size_t) 4, tmpfp) == 0
6c1aee8
+    if (fwrite ("w\nq\n", sizeof (char), (size_t) 4, tmpfp) < (size_t) 4
6c1aee8
 	|| fflush (tmpfp) != 0)
6c1aee8
       write_fatal ();
6c1aee8