diff options
author | Werner Koch <[email protected]> | 2023-06-09 15:40:53 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2023-07-05 09:15:55 +0000 |
commit | 8425cdcc8eb98a1e894f629f46ce32b5c52ea01a (patch) | |
tree | 7096ac5c66a62485e9d65506a8900e4a26814be2 | |
parent | w32: Map ERROR_FILE_INVALID to EIO. (diff) | |
download | gnupg-8425cdcc8eb98a1e894f629f46ce32b5c52ea01a.tar.gz gnupg-8425cdcc8eb98a1e894f629f46ce32b5c52ea01a.zip |
gpg: Print status line and proper diagnostics for write errors.
* common/iobuf.c (file_filter): Improve diagnostics.
* g10/build-packet.c (do_plaintext): Make sure to cache all error
cases.
--
GnuPG-bug-id: 6528
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | common/iobuf.c | 9 | ||||
-rw-r--r-- | g10/build-packet.c | 14 |
3 files changed, 20 insertions, 6 deletions
@@ -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; |