aboutsummaryrefslogtreecommitdiffstats
path: root/g10/cpr.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2019-03-15 12:02:44 +0000
committerWerner Koch <[email protected]>2019-03-15 12:03:34 +0000
commitf06b6fe47f56a15ac426665c3d9661d4b104696f (patch)
treecfeb0037e5729a60963fbbed1cb109b124ecbfcb /g10/cpr.c
parentgpg: Fix recently introduced use after free. (diff)
downloadgnupg-f06b6fe47f56a15ac426665c3d9661d4b104696f.tar.gz
gnupg-f06b6fe47f56a15ac426665c3d9661d4b104696f.zip
gpg: Simplify an interactive import status line.
* g10/cpr.c (write_status_printf): Escape CR and LF. * g10/import.c (print_import_check): Simplify by using write_status_printf and hexfingerprint. Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'g10/cpr.c')
-rw-r--r--g10/cpr.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/g10/cpr.c b/g10/cpr.c
index ed68b3f15..3d39d6bda 100644
--- a/g10/cpr.c
+++ b/g10/cpr.c
@@ -142,7 +142,8 @@ write_status ( int no )
/* Write a status line with code NO followed by the string TEXT and
- directly followed by the remaining strings up to a NULL. */
+ * directly followed by the remaining strings up to a NULL. Embedded
+ * CR and LFs in the strings (but not in TEXT) are C-style escaped.*/
void
write_status_strings (int no, const char *text, ...)
{
@@ -188,12 +189,12 @@ write_status_text (int no, const char *text)
/* Write a status line with code NO followed by the output of the
- * printf style FORMAT. The caller needs to make sure that LFs and
- * CRs are not printed. */
+ * printf style FORMAT. Embedded CR and LFs are C-style escaped. */
void
write_status_printf (int no, const char *format, ...)
{
va_list arg_ptr;
+ char *buf;
if (!statusfp || !status_currently_allowed (no) )
return; /* Not enabled or allowed. */
@@ -204,7 +205,30 @@ write_status_printf (int no, const char *format, ...)
{
es_putc ( ' ', statusfp);
va_start (arg_ptr, format);
- es_vfprintf (statusfp, format, arg_ptr);
+ buf = gpgrt_vbsprintf (format, arg_ptr);
+ if (!buf)
+ log_error ("error printing status line: %s\n",
+ gpg_strerror (gpg_err_code_from_syserror ()));
+ else
+ {
+ if (strpbrk (buf, "\r\n"))
+ {
+ const byte *s;
+ for (s=buf; *s; s++)
+ {
+ if (*s == '\n')
+ es_fputs ("\\n", statusfp);
+ else if (*s == '\r')
+ es_fputs ("\\r", statusfp);
+ else
+ es_fputc (*s, statusfp);
+ }
+ }
+ else
+ es_fputs (buf, statusfp);
+ gpgrt_free (buf);
+ }
+
va_end (arg_ptr);
}
es_putc ('\n', statusfp);