Better support unsigned time_t
[gnupg.git] / g10 / plaintext.c
index ee0d413..1d4c8c7 100644 (file)
@@ -158,7 +158,7 @@ handle_plaintext (PKT_plaintext * pt, md_filter_context_t * mfx,
     ;
   else if (is_secured_filename (fname))
     {
-      errno = EPERM;
+      gpg_err_set_errno (EPERM);
       rc = gpg_error_from_syserror ();
       log_error (_("error creating `%s': %s\n"), fname, strerror (errno));
       goto leave;
@@ -448,7 +448,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 need to check the return code to detect errors like disk
+         full for short plaintexts.  See bug#1207.  Checking return
+         values is a good idea in any case.  */
+      if (!rc)
+        rc = gpg_error_from_syserror ();
+      log_error ("error flushing `%s': %s\n", "[stdout]", strerror (errno));
+    }
 
   if (fp && fp != stdout && fp != opt.outfp)
     fclose (fp);
@@ -548,7 +556,7 @@ ask_for_detached_datafile (gcry_md_hd_t md, gcry_md_hd_t md2,
            {
              iobuf_close (fp);
              fp = NULL;
-             errno = EPERM;
+             gpg_err_set_errno (EPERM);
            }
          if (!fp && errno == ENOENT)
            {
@@ -622,7 +630,7 @@ hash_datafiles (gcry_md_hd_t md, gcry_md_hd_t md2, strlist_t files,
        {
          iobuf_close (fp);
          fp = NULL;
-         errno = EPERM;
+         gpg_err_set_errno (EPERM);
        }
       if (!fp)
        {
@@ -654,7 +662,7 @@ hash_datafile_by_fd (gcry_md_hd_t md, gcry_md_hd_t md2, int data_fd,
   if (is_secured_file (data_fd))
     {
       fp = NULL;
-      errno = EPERM;
+      gpg_err_set_errno (EPERM);
     }
   else
     fp = iobuf_fdopen_nc (data_fd, "rb");
@@ -689,7 +697,8 @@ setup_plaintext_name (const char *filename, IOBUF iobuf)
 {
   PKT_plaintext *pt;
 
-  if (filename || opt.set_filename)
+  if ((filename && !iobuf_is_pipe_filename (filename))
+       || (opt.set_filename && !iobuf_is_pipe_filename (opt.set_filename)))
     {
       char *s;