gpgparsemail: Fix case of zero length continuation lines.
authorWerner Koch <wk@gnupg.org>
Thu, 9 Apr 2015 17:06:33 +0000 (19:06 +0200)
committerNIIBE Yutaka <gniibe@fsij.org>
Wed, 15 Apr 2015 07:07:56 +0000 (16:07 +0900)
* tools/rfc822parse.c (parse_field): Loop after continuation line.
--

Using header lines like

  Name:[lf]
  [space][lf]
  [lf]

resulted in running into the "(s2 = strchr (delimiters2, *s)" branch
and inserting a new token for the empty continuation line.  This also
led to one byte read after the string which is what Hanno figured.
The new code should handle empty continuation lines correct.

Reported-by: Hanno Böck
Signed-off-by: Werner Koch <wk@gnupg.org>
(backported from 2.1 commit 3fbeba64a8bfb2b673230c124a3d616b6568fd2f)

tools/rfc822parse.c

index 8fbe3c2..7b86ea9 100644 (file)
@@ -808,10 +808,12 @@ parse_field (HDR_LINE hdr)
   s++; /* Move over the colon. */
   for (;;)
     {
-      if (!*s)
+      while (!*s)
        {
          if (!hdr->next || !hdr->next->cont)
-           break;
+            return tok; /* Ready.  */
+
+          /* Next item is a header continuation line.  */
          hdr = hdr->next;
          s = hdr->line;
        }
@@ -824,10 +826,11 @@ parse_field (HDR_LINE hdr)
          invalid = 0;
          for (s++;; s++)
            {
-             if (!*s)
+             while (!*s)
                {
                  if (!hdr->next || !hdr->next->cont)
                    break;
+                  /* Next item is a header continuation line.  */
                  hdr = hdr->next;
                  s = hdr->line;
                }
@@ -880,6 +883,7 @@ parse_field (HDR_LINE hdr)
                    
              if (*s2 || !hdr->next || !hdr->next->cont)
                break;
+              /* Next item is a header continuation line.  */
              hdr = hdr->next;
              s = hdr->line;
            }
@@ -931,8 +935,7 @@ parse_field (HDR_LINE hdr)
          s++;
        }
     }
-
-  return tok;
+  /*NOTREACHED*/
 
  failure:
   {