]> git.ozlabs.org Git - ccan/blobdiff - ccan/rfc822/rfc822.c
rfc822: Fix bug parsing headers when body begins with linear whitespace
[ccan] / ccan / rfc822 / rfc822.c
index 3bd3dd747ae28f532b4eef592297cc0e9b689d4f..4a5e4ccdcc709d130fb6c7222ff215d9858e91ac 100644 (file)
@@ -150,29 +150,33 @@ static struct rfc822_header *next_header_parse(struct rfc822_msg *msg)
        if (msg->body && (msg->remainder >= msg->body))
                return NULL;
 
        if (msg->body && (msg->remainder >= msg->body))
                return NULL;
 
-       eh = h = msg->remainder;
-       do {
-               eh = next_line(eh, msg->end);
-       } while ((eh < msg->end) && rfc822_iswsp(*eh));
-
-       if (eh >= msg->end)
-               msg->remainder = NULL;
-       else
-               msg->remainder = eh;
+       h = msg->remainder;
+       eh = next_line(h, msg->end);
 
        ev = eh;
        if ((ev > h) && (ev[-1] == '\n'))
                ev--;
        if ((ev > h) && (ev[-1] == '\r'))
                ev--;
 
        ev = eh;
        if ((ev > h) && (ev[-1] == '\n'))
                ev--;
        if ((ev > h) && (ev[-1] == '\r'))
                ev--;
-
        if (ev == h) {
                /* Found the end of the headers */
        if (ev == h) {
                /* Found the end of the headers */
+
+               assert(!msg->body || (msg->body == eh));
+
                if (eh < msg->end)
                        msg->body = eh;
                return NULL;
        }
 
                if (eh < msg->end)
                        msg->body = eh;
                return NULL;
        }
 
+       while ((eh < msg->end) && rfc822_iswsp(*eh))
+               eh = next_line(eh, msg->end);
+
+       if (eh >= msg->end)
+               msg->remainder = NULL;
+       else
+               msg->remainder = eh;
+
+
        hi = talloc_zero(msg, struct rfc822_header);
        ALLOC_CHECK(hi, NULL);
 
        hi = talloc_zero(msg, struct rfc822_header);
        ALLOC_CHECK(hi, NULL);