On Wed, 2008-10-15 at 08:35 +0200, Andre Hübner wrote:
> Hi,
> 
> > oops, sorry, I meant actually:
> 
> > fr 6
> > p *stream.parent
> > p *stream.parent.real_stream
> 
> No, problem. i have enough cores ;)

So it happens regularly? Can you reproduce it? I can't really see how
it's crashing. Could you apply the attached patch, and also compile the
lib/*.c and lib-mail/istream-header-filter.c without -O2 so the
backtrace will be more usable? (I usually do it by removing -O2 from the
subdirs' Makefile and then make clean + make in those subdirs.)

diff -r c9e9cf2ad4c9 src/lib/istream-limit.c
--- a/src/lib/istream-limit.c	Thu Oct 16 15:19:42 2008 +0300
+++ b/src/lib/istream-limit.c	Thu Oct 16 15:48:08 2008 +0300
@@ -38,8 +38,8 @@
 {
 	struct limit_istream *lstream = (struct limit_istream *) stream;
 	uoff_t left;
-	ssize_t ret;
-	size_t pos;
+	ssize_t ret, ret2;
+	size_t pos, orig_pos;
 
 	if (stream->istream.v_offset +
 	    (stream->pos - stream->skip) >= lstream->v_size) {
@@ -55,6 +55,7 @@
 	}
 
 	stream->buffer = i_stream_get_data(stream->parent, &pos);
+	orig_pos = pos;
 	if (pos <= stream->pos) {
 		if ((ret = i_stream_read(stream->parent)) == -2)
 			return -2;
@@ -77,12 +78,12 @@
 		}
 	}
 
-	ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
+	ret2 = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
 		(ret == 0 ? 0 : -1);
-	stream->pos = pos;
 	i_assert(ret != -1 || stream->istream.eof ||
 		 stream->istream.stream_errno != 0);
-	return ret;
+	stream->pos = pos;
+	return ret2;
 }
 
 static void i_stream_limit_seek(struct istream_private *stream, uoff_t v_offset,

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to