gpg: Simplify an interactive import status line.
authorWerner Koch <wk@gnupg.org>
Fri, 15 Mar 2019 12:02:44 +0000 (13:02 +0100)
committerWerner Koch <wk@gnupg.org>
Fri, 15 Mar 2019 12:03:34 +0000 (13:03 +0100)
* 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 <wk@gnupg.org>
g10/cpr.c
g10/import.c

index ed68b3f..3d39d6b 100644 (file)
--- 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);
index 25ccc2f..25c9a66 100644 (file)
@@ -1084,23 +1084,14 @@ print_import_ok (PKT_public_key *pk, unsigned int reason)
 static void
 print_import_check (PKT_public_key * pk, PKT_user_id * id)
 {
-  char * buf;
-  byte fpr[24];
+  byte hexfpr[2*MAX_FINGERPRINT_LEN+1];
   u32 keyid[2];
-  size_t i, n;
-  size_t pos = 0;
 
-  buf = xmalloc (17+41+id->len+32);
   keyid_from_pk (pk, keyid);
-  sprintf (buf, "%08X%08X ", keyid[0], keyid[1]);
-  pos = 17;
-  fingerprint_from_pk (pk, fpr, &n);
-  for (i = 0; i < n; i++, pos += 2)
-    sprintf (buf+pos, "%02X", fpr[i]);
-  strcat (buf, " ");
-  strcat (buf, id->name);
-  write_status_text (STATUS_IMPORT_CHECK, buf);
-  xfree (buf);
+  hexfingerprint (pk, hexfpr, sizeof hexfpr);
+  write_status_printf (STATUS_IMPORT_CHECK, "%08X%08X %s %s",
+                       keyid[0], keyid[1], hexfpr, id->name);
+
 }