[dovecot-cvs] dovecot/src/lib istream-seekable.c,1.3,1.4
cras at dovecot.org
cras at dovecot.org
Sat May 28 15:17:42 EEST 2005
Update of /var/lib/cvs/dovecot/src/lib
In directory talvi:/tmp/cvs-serv7176
Modified Files:
istream-seekable.c
Log Message:
Seekable stream was broken after its memory limit was reached and it started
using temporary file.
Index: istream-seekable.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib/istream-seekable.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- istream-seekable.c 23 Apr 2005 19:41:40 -0000 1.3
+++ istream-seekable.c 28 May 2005 12:17:40 -0000 1.4
@@ -199,7 +199,7 @@
{
struct seekable_istream *sstream = (struct seekable_istream *)stream;
const unsigned char *data;
- size_t size;
+ size_t size, pos;
ssize_t ret;
stream->buffer = CONST_PTR_OFFSET(stream->buffer, stream->skip);
@@ -215,6 +215,7 @@
i_stream_close(&stream->istream);
return -1;
}
+ i_assert(sstream->buffer == NULL);
}
while (stream->istream.v_offset + stream->pos >= sstream->write_peak) {
@@ -231,6 +232,7 @@
i_stream_close(&stream->istream);
return -1;
}
+ i_stream_sync(sstream->fd_input);
i_stream_skip(sstream->cur_input, size);
sstream->write_peak += size;
}
@@ -242,6 +244,14 @@
stream->istream.stream_errno =
sstream->fd_input->stream_errno;
}
+
+ stream->buffer = i_stream_get_data(sstream->fd_input, &pos);
+ stream->pos -= stream->skip;
+ stream->skip = 0;
+
+ ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
+ (ret == 0 ? 0 : -1);
+ stream->pos = pos;
return ret;
}
@@ -264,8 +274,10 @@
i_stream_skip(&stream->istream, stream->skip);
} while ((ret = _read(stream)) > 0);
- if (ret == 0)
- i_panic("get_size() used for non-blocking stream");
+ if (ret == 0) {
+ i_panic("i_stream_stat() used for non-blocking "
+ "seekable stream");
+ }
i_stream_seek(&stream->istream, old_offset);
}
More information about the dovecot-cvs
mailing list