common,tools: Always escape newlines when escaping data.
authorJustus Winter <justus@g10code.com>
Wed, 1 Mar 2017 16:47:47 +0000 (17:47 +0100)
committerJustus Winter <justus@g10code.com>
Thu, 2 Mar 2017 08:31:11 +0000 (09:31 +0100)
* common/stringhelp.c (do_percent_escape): Always escape newlines.
* tools/gpgconf-comp.c (gc_percent_escape): Likewise.
--
Newlines always pose a problem for a line-based communication format.

GnuPG-bug-id: 2387
Signed-off-by: Justus Winter <justus@g10code.com>
common/stringhelp.c
tools/gpgconf-comp.c

index 341dd52..bea1466 100644 (file)
@@ -1052,7 +1052,8 @@ do_percent_escape (const char *str, const char *extra, int die)
     return NULL;
 
   for (i=j=0; str[i]; i++)
-    if (str[i] == ':' || str[i] == '%' || (extra && strchr (extra, str[i])))
+    if (str[i] == ':' || str[i] == '%' || str[i] == '\n'
+        || (extra && strchr (extra, str[i])))
       j++;
   if (die)
     ptr = xmalloc (i + 2 * j + 1);
@@ -1077,6 +1078,13 @@ do_percent_escape (const char *str, const char *extra, int die)
          ptr[i++] = '2';
          ptr[i++] = '5';
        }
+      else if (*str == '\n')
+       {
+         /* The newline is problematic in a line-based format.  */
+         ptr[i++] = '%';
+         ptr[i++] = '0';
+         ptr[i++] = 'a';
+       }
       else if (extra && strchr (extra, *str))
         {
          ptr[i++] = '%';
index d53947e..0c939e5 100644 (file)
@@ -1491,6 +1491,13 @@ gc_percent_escape (const char *src)
          *(dst++) = '2';
          *(dst++) = 'c';
        }
+      else if (*src == '\n')
+       {
+         /* The newline is problematic in a line-based format.  */
+         *(dst++) = '%';
+         *(dst++) = '0';
+         *(dst++) = 'a';
+       }
       else
        *(dst++) = *(src);
       src++;