Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6728:79110f203734 HEAD
More fixes to handling nonblocking streams.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 08 Nov 2007 03:21:48 +0200 |
parents | c49084d2148e |
children | f323da4ef459 |
files | src/lib-mail/message-header-parser.c |
diffstat | 1 files changed, 21 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-mail/message-header-parser.c Thu Nov 08 03:08:03 2007 +0200 +++ b/src/lib-mail/message-header-parser.c Thu Nov 08 03:21:48 2007 +0200 @@ -60,6 +60,7 @@ size_t i, size, startpos, colon_pos, parse_size; int ret; bool continued, continues, last_no_newline, last_crlf; + bool no_newline, crlf_newline; *hdr_r = NULL; if (line->eoh) @@ -70,15 +71,6 @@ ctx->skip = 0; } - startpos = 0; colon_pos = UINT_MAX; - - last_crlf = line->crlf_newline && - (ctx->flags & MESSAGE_HEADER_PARSER_FLAG_DROP_CR) == 0; - last_no_newline = line->no_newline || - (ctx->flags & MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE) != 0; - line->no_newline = FALSE; - line->crlf_newline = FALSE; - if (line->continues) { if (line->use_full_value && !line->continued) { /* save the first line */ @@ -91,24 +83,27 @@ } buffer_append(ctx->value_buf, line->value, line->value_len); - line->value_len = 0; } colon_pos = 0; } else { /* new header line */ - line->name_offset = ctx->input->v_offset; + line->name_offset = ctx->input->v_offset; + colon_pos = UINT_MAX; } + no_newline = FALSE; + crlf_newline = FALSE; continued = line->continues; continues = FALSE; - for (;;) { + + for (startpos = 0;;) { ret = i_stream_read_data(ctx->input, &msg, &size, startpos+1); if (ret >= 0) { /* we want to know one byte in advance to find out if it's multiline header */ - parse_size = size-1; + parse_size = size == 0 ? 0 : size-1; } else { parse_size = size; } @@ -117,7 +112,7 @@ if (ret == -1) { if (startpos > 0) { /* header ended unexpectedly. */ - line->no_newline = TRUE; + no_newline = TRUE; ctx->skip = startpos; break; } @@ -139,7 +134,7 @@ ctx->hdr_size->lines++; if (msg[0] == '\r') { ctx->skip = 2; - line->crlf_newline = TRUE; + crlf_newline = TRUE; } else { ctx->skip = 1; if (ctx->hdr_size != NULL) @@ -177,7 +172,7 @@ continues = TRUE; } - line->no_newline = TRUE; + no_newline = TRUE; ctx->skip = size; break; } @@ -230,7 +225,7 @@ if (ctx->hdr_size != NULL) ctx->hdr_size->virtual_size++; } else { - line->crlf_newline = TRUE; + crlf_newline = TRUE; } i_stream_skip(ctx->input, i); startpos = 0; @@ -248,7 +243,7 @@ size = i; } else { size = i-1; - line->crlf_newline = TRUE; + crlf_newline = TRUE; } ctx->skip = i+1; @@ -258,7 +253,15 @@ startpos = i; } + last_crlf = line->crlf_newline && + (ctx->flags & MESSAGE_HEADER_PARSER_FLAG_DROP_CR) == 0; + last_no_newline = line->no_newline || + (ctx->flags & MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE) != 0; + line->continues = continues; + line->continued = continued; + line->crlf_newline = crlf_newline; + line->no_newline = no_newline; if (size == 0) { /* end of headers */ line->eoh = TRUE;