aboutsummaryrefslogtreecommitdiffstats
path: root/sm/keylist.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2024-10-23 08:40:36 +0000
committerWerner Koch <[email protected]>2024-10-23 09:43:08 +0000
commit18081e2ecf43de2be6ad5a7ca3384e1e2b66914d (patch)
tree85aa3365b947da5bc7da0cea5610a60da6517eb3 /sm/keylist.c
parentagent: Fix resource leak for PRIMARY_CTX. (diff)
downloadgnupg-18081e2ecf43de2be6ad5a7ca3384e1e2b66914d.tar.gz
gnupg-18081e2ecf43de2be6ad5a7ca3384e1e2b66914d.zip
gpgsm: Terminate key listing on output write error.
* sm/keylist.c (list_internal_keys): Detect write errors to the output stream. * sm/server.c (any_failure_printed): New var. (gpgsm_status2): Handle new var. Move statusfp init to ... (gpgsm_init_statusfp): new function. (gpgsm_exit_failure_status): New. * sm/gpgsm.c (main): Explicit statusfp init. (gpgsm_exit): Print failure status on error. -- Test by using gpgsm -k >/dev/full gpgsm -k --wit-colons >/dev/full and also by redirecting to a file on a small partition. GnuPG-bug-id: 6185
Diffstat (limited to 'sm/keylist.c')
-rw-r--r--sm/keylist.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/sm/keylist.c b/sm/keylist.c
index a29c7d792..41e7ca309 100644
--- a/sm/keylist.c
+++ b/sm/keylist.c
@@ -1663,6 +1663,7 @@ list_internal_keys (ctrl_t ctrl, strlist_t names, estream_t fp,
resname = keydb_get_resource_name (hd);
+ es_clearerr (fp);
if (lastresname != resname )
{
int i;
@@ -1716,6 +1717,20 @@ list_internal_keys (ctrl_t ctrl, strlist_t names, estream_t fp,
ksba_cert_release (lastcert);
lastcert = cert;
cert = NULL;
+
+ if (es_ferror (fp))
+ rc = gpg_error_from_syserror ();
+
+ /* For faster key listings we flush the output after each cert
+ * only if we list secret keys. */
+ if ((mode & 2) && es_fflush (fp) && !rc)
+ rc = gpg_error_from_syserror ();
+
+ if (rc)
+ {
+ log_error (_("error writing to output: %s\n"), gpg_strerror (rc));
+ goto leave;
+ }
}
if (gpg_err_code (rc) == GPG_ERR_NOT_FOUND)
rc = 0;