aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2023-06-09 15:40:53 +0000
committerWerner Koch <[email protected]>2023-07-05 09:15:55 +0000
commit8425cdcc8eb98a1e894f629f46ce32b5c52ea01a (patch)
tree7096ac5c66a62485e9d65506a8900e4a26814be2
parentw32: Map ERROR_FILE_INVALID to EIO. (diff)
downloadgnupg-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--NEWS3
-rw-r--r--common/iobuf.c9
-rw-r--r--g10/build-packet.c14
3 files changed, 20 insertions, 6 deletions
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;