# HG changeset patch # User Timo Sirainen # Date 1031156231 -10800 # Node ID 9660df1ca44f751eff8028012c450b318b1692a6 # Parent 7e1f18c5d70881a775e8d138443b21ddc1070668 message_parse_header() was buggy with big headers, and io_buffer_read_data() should have returned the data so far even if it overflowed. diff -r 7e1f18c5d708 -r 9660df1ca44f src/lib-mail/message-parser.c --- a/src/lib-mail/message-parser.c Wed Sep 04 19:15:44 2002 +0300 +++ b/src/lib-mail/message-parser.c Wed Sep 04 19:17:11 2002 +0300 @@ -270,10 +270,11 @@ while (io_buffer_read_data(inbuf, &msg, &size, startpos) >= 0) { for (i = startpos; i < size; i++) { if (msg[i] == '\n') { - if (i == 0 || msg[i-1] != '\r') - msg_size->virtual_size++; - if (msg_size != NULL) + if (msg_size != NULL) { + if (i == 0 || msg[i-1] != '\r') + msg_size->virtual_size++; msg_size->lines++; + } break; } } @@ -319,11 +320,6 @@ colon_pos = UINT_MAX; while ((ret = io_buffer_read_data(inbuf, &msg, &size, startpos+1)) != -1) { - if (size == 0) { - /* no, we never want empty buffer */ - continue; - } - if (ret == -2) { /* overflow, line is too long. just skip it. */ i_assert(size > 2); @@ -334,6 +330,11 @@ continue; } + if (size == 0) { + /* no, we never want empty buffer */ + continue; + } + /* don't parse the last character, so we can always have one character read-ahead. we never care about the last character anyway, it's either the first character in @@ -409,16 +410,14 @@ if (i > 0) { /* leave the last line to buffer */ - startpos = line_start; - line_start = 0; + if (colon_pos != UINT_MAX) + colon_pos -= line_start; + if (hdr_size != NULL) + hdr_size->physical_size += line_start; + io_buffer_skip(inbuf, line_start); - if (colon_pos != UINT_MAX) - colon_pos -= startpos; - - io_buffer_skip(inbuf, i - startpos); - - if (hdr_size != NULL) - hdr_size->physical_size += i - startpos; + startpos = i-line_start; + line_start = 0; } } io_buffer_skip(inbuf, startpos); diff -r 7e1f18c5d708 -r 9660df1ca44f src/lib/iobuffer.c --- a/src/lib/iobuffer.c Wed Sep 04 19:15:44 2002 +0300 +++ b/src/lib/iobuffer.c Wed Sep 04 19:17:11 2002 +0300 @@ -855,10 +855,12 @@ { int ret; - if (buf->pos - buf->skip <= threshold) { + if (buf->pos - buf->skip > threshold) + ret = 1; + else { /* we need more data */ ret = io_buffer_read(buf); - if (ret <= 0) { + if (ret <= 0 && ret != -2) { *size = 0; *data = NULL; return ret; @@ -866,7 +868,7 @@ } *data = io_buffer_get_data(buf, size); - return 1; + return ret; } unsigned char *io_buffer_get_space(IOBuffer *buf, unsigned int size)