diff --git a/NEWS b/NEWS index decda0ce4..1c0fef360 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,9 @@ Noteworthy changes in version 2.2.42 (unreleased) * gpg: Add modes 16 and 30 to --gen-random. + * gpg: Emit status line and proper diagnostics for write errors. + [T6528] + * gpgsm: Support ECC certificates. [T6253] * gpgsm: Also announce AES256-CBC in signatures. [rGaa397fdcdb21] diff --git a/common/iobuf.c b/common/iobuf.c index f4766c6a4..4d207d3f8 100644 --- a/common/iobuf.c +++ b/common/iobuf.c @@ -483,7 +483,8 @@ file_filter (void *opaque, int control, iobuf_t chain, byte * buf, if (ec != ERROR_BROKEN_PIPE) { rc = gpg_error_from_errno (ec); - log_error ("%s: read error: ec=%d\n", a->fname, ec); + log_error ("%s: read error: %s (ec=%d)\n", + a->fname, gpg_strerror (rc), ec); } } else if (!nread) @@ -543,7 +544,8 @@ file_filter (void *opaque, int control, iobuf_t chain, byte * buf, { int ec = (int) GetLastError (); rc = gpg_error_from_errno (ec); - log_error ("%s: write error: ec=%d\n", a->fname, ec); + log_error ("%s: write error: %s (ec=%d)\n", + a->fname, gpg_strerror (rc), ec); break; } p += n; @@ -601,7 +603,8 @@ file_filter (void *opaque, int control, iobuf_t chain, byte * buf, if (ec != ERROR_BROKEN_PIPE) { rc = gpg_error_from_errno (ec); - log_error ("%s: read error: ec=%d\n", a->fname, ec); + log_error ("%s: read error: %s (ec=%d)\n", + a->fname, gpg_strerror (rc), ec); } a->npeeked = 0; } diff --git a/g10/build-packet.c b/g10/build-packet.c index 63bfadbe0..5de5114fb 100644 --- a/g10/build-packet.c +++ b/g10/build-packet.c @@ -761,12 +761,20 @@ do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt ) if (nbytes == (size_t)(-1) && (iobuf_error (out) || iobuf_error (pt->buf))) return iobuf_error (out)? iobuf_error (out):iobuf_error (pt->buf); + /* Always get the error to catch write errors because + * iobuf_copy does not reliable return (-1) in that case. */ + rc = iobuf_error (out); if(ctb_new_format_p (ctb) && !pt->len) /* Turn off partial body length mode. */ iobuf_set_partial_body_length_mode (out, 0); - if( pt->len && nbytes != pt->len ) - log_error("do_plaintext(): wrote %lu bytes but expected %lu bytes\n", - (ulong)nbytes, (ulong)pt->len ); + if (pt->len && nbytes != pt->len) + { + log_error ("do_plaintext(): wrote %lu bytes" + " but expected %lu bytes\n", + (ulong)nbytes, (ulong)pt->len ); + if (!rc) /* Just in case no error was set */ + rc = gpg_error (GPG_ERR_EIO); + } } return rc;