From ccbb0cfeefed096a9841b6557d10eef12d55b721 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Fri, 26 Jun 2020 15:21:31 +0200 Subject: sm: Try not to output a partial new message after an error. * sm/gpgsm.c (main) : Uses gpgrt_fcancel on error. -- When creating a signature or encrypting and the respective key is not available or the user canceled the PIN entry gpgsm prints the initial part of the message due to internal buffering in gpgrt. By using gpgrt_fcancel we can avoid this at least as long as the data is less than the standard buffer size (which is currently 8k). If is not a complete solution but the best we can do easily. Outputting to the tty is anyway more of a testing aid than for real use. This makes use of the new gpgrt_fcancel API. Signed-off-by: Werner Koch --- sm/gpgsm.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/sm/gpgsm.c b/sm/gpgsm.c index 541f904df..b91667a1e 100644 --- a/sm/gpgsm.c +++ b/sm/gpgsm.c @@ -953,6 +953,7 @@ parse_keyserver_line (char *line, int main ( int argc, char **argv) { + gpg_error_t err; gpgrt_argparse_t pargs; int orig_argc; char **orig_argv; @@ -1929,7 +1930,15 @@ main ( int argc, char **argv) else wrong_args ("--encrypt [datafile]"); +#if GPGRT_VERSION_NUMBER >= 0x012700 /* >= 1.39 */ + if (err) + gpgrt_fcancel (fp); + else + es_fclose (fp); +#else + (void)err; es_fclose (fp); +#endif } break; @@ -1941,14 +1950,22 @@ main ( int argc, char **argv) signing because that is what gpg does.*/ set_binary (stdin); if (!argc) /* Create from stdin. */ - gpgsm_sign (&ctrl, signerlist, 0, detached_sig, fp); + err = gpgsm_sign (&ctrl, signerlist, 0, detached_sig, fp); else if (argc == 1) /* From file. */ - gpgsm_sign (&ctrl, signerlist, + err = gpgsm_sign (&ctrl, signerlist, open_read (*argv), detached_sig, fp); else wrong_args ("--sign [datafile]"); +#if GPGRT_VERSION_NUMBER >= 0x012700 /* >= 1.39 */ + if (err) + gpgrt_fcancel (fp); + else + es_fclose (fp); +#else + (void)err; es_fclose (fp); +#endif } break; -- cgit v1.2.3