diff options
author | Werner Koch <[email protected]> | 2024-10-23 08:40:36 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2024-10-23 09:43:08 +0000 |
commit | 18081e2ecf43de2be6ad5a7ca3384e1e2b66914d (patch) | |
tree | 85aa3365b947da5bc7da0cea5610a60da6517eb3 /sm/keylist.c | |
parent | agent: Fix resource leak for PRIMARY_CTX. (diff) | |
download | gnupg-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.c | 15 |
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; |