changeset 153:9660df1ca44f HEAD

message_parse_header() was buggy with big headers, and io_buffer_read_data() should have returned the data so far even if it overflowed.
author Timo Sirainen <tss@iki.fi>
date Wed, 04 Sep 2002 19:17:11 +0300
parents 7e1f18c5d708
children 2dcabe0fd1cb
files src/lib-mail/message-parser.c src/lib/iobuffer.c
diffstat 2 files changed, 21 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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)