* plaintext.c (handle_plaintext): Make sure that the stdout flush
authorDavid Shaw <dshaw@jabberwocky.com>
Fri, 26 Mar 2010 16:57:09 +0000 (16:57 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Fri, 26 Mar 2010 16:57:09 +0000 (16:57 +0000)
succeeded, so we can't lose data when using gpg in a pipeline.  Fixes
bug #1207.

g10/ChangeLog
g10/plaintext.c

index acd63a0..56c227b 100644 (file)
@@ -1,3 +1,9 @@
+2010-03-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * plaintext.c (handle_plaintext): Make sure that the stdout flush
+       succeeded, so we can't lose data when using gpg in a pipeline.
+       Fixes bug #1207.
+
 2010-02-17  Werner Koch  <wk@g10code.com>
 
        * keygen.c (ask_user_id): Avoid infinite loop in case of invalid
@@ -13615,7 +13621,7 @@ Thu Feb 12 22:24:42 1998  Werner Koch  (wk@frodo)
 
 
  Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
-          2007, 2008, 2009 Free Software Foundation, Inc.
+          2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
  This file is free software; as a special exception the author gives
  unlimited permission to copy and/or distribute it, with or without
index f847a12..61c4f24 100644 (file)
@@ -1,6 +1,6 @@
 /* plaintext.c -  process plaintext packets
- * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
- *               2006 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ *               2007, 2010 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -392,7 +392,15 @@ handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
     /* Make sure that stdout gets flushed after the plaintext has
        been handled.  This is for extra security as we do a
        flush anyway before checking the signature.  */
-    fflush (stdout);
+    if(fflush(stdout))
+      {
+       /* We check whether this fflush succeeded since fp might have
+          been stdout piping to a file.  The fflush could fail if the
+          file cannot be written (disk full, etc).  See bug 1207 for
+          more. */
+       log_error("Error flushing plaintext: %s\n",strerror(errno));
+       rc=G10ERR_WRITE_FILE;
+      }
 
     if( fp && fp != stdout )
        fclose(fp);