dovecot-2.0: message header parser: Don't set hdr->continues=TRU...

dovecot at dovecot.org dovecot at dovecot.org
Tue May 26 23:52:04 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/7b247ab96520
changeset: 9390:7b247ab96520
user:      Timo Sirainen <tss at iki.fi>
date:      Tue May 26 16:31:42 2009 -0400
description:
message header parser: Don't set hdr->continues=TRUE when hdr->eoh=TRUE.
This happened if body began with LWSP. Also if parser has seen eoh but not
the following character, don't bother waiting for it.

diffstat:

1 file changed, 11 insertions(+), 8 deletions(-)
src/lib-mail/message-header-parser.c |   19 +++++++++++--------

diffs (43 lines):

diff -r ca62d712d149 -r 7b247ab96520 src/lib-mail/message-header-parser.c
--- a/src/lib-mail/message-header-parser.c	Tue May 26 16:29:31 2009 -0400
+++ b/src/lib-mail/message-header-parser.c	Tue May 26 16:31:42 2009 -0400
@@ -106,14 +106,10 @@ int message_parse_header_next(struct mes
 				/* error / EOF with no bytes */
 				return -1;
 			}
-			if (ret == 0 && !ctx->input->eof) {
-				/* stream is nonblocking - need more data */
-				return 0;
-			}
-			i_assert(size > 0);
-
-			if (msg[0] == '\n' ||
-			    (msg[0] == '\r' && size > 1 && msg[1] == '\n')) {
+
+			if (size > 0 &&
+			    (msg[0] == '\n' ||
+			     (msg[0] == '\r' && size > 1 && msg[1] == '\n'))) {
 				/* end of headers - this mostly happens just
 				   with mbox where headers are read separately
 				   from body */
@@ -130,6 +126,11 @@ int message_parse_header_next(struct mes
 				}
 				break;
 			}
+			if (ret == 0 && !ctx->input->eof) {
+				/* stream is nonblocking - need more data */
+				return 0;
+			}
+			i_assert(size > 0);
 
 			/* a) line is larger than input buffer
 			   b) header ended unexpectedly */
@@ -256,6 +257,8 @@ int message_parse_header_next(struct mes
 		line->name_len = line->value_len = line->full_value_len = 0;
 		line->name = ""; line->value = line->full_value = NULL;
 		line->middle = NULL; line->middle_len = 0;
+		line->full_value_offset = line->name_offset;
+		line->continues = FALSE;
 	} else if (line->continued) {
 		line->value = msg;
 		line->value_len = size;


More information about the dovecot-cvs mailing list