[Dovecot] imap-zlib patch to fix runaway imap process
Mike Abbott
michael.abbott at apple.com
Wed Apr 21 03:19:11 EEST 2010
Here is a patch to fix the problem where an imap process runs away when imap-zlib is in use. The backtrace showed:
io_loop_handler_run ->
stream_send_io ->
client_output ->
o_stream_flush ->
o_stream_zlib_flush ->
o_stream_zlib_send_flush
When o_stream_zlib_flush returns 0, stream_send_io reinstates the IO_WRITE event, causing the infinite loop.
diff -ur dovecot-2.0.beta4/src/plugins/zlib/ostream-bzlib.c dovecot-2.0.beta4+fix/src/plugins/zlib/ostream-bzlib.c
--- dovecot-2.0.beta4/src/plugins/zlib/ostream-bzlib.c 2010-02-12 20:22:07.000000000 -0600
+++ dovecot-2.0.beta4+fix/src/plugins/zlib/ostream-bzlib.c 2010-04-20 19:15:29.000000000 -0500
@@ -122,15 +122,15 @@
static int o_stream_bzlib_flush(struct ostream_private *stream)
{
struct bzlib_ostream *zstream = (struct bzlib_ostream *)stream;
+ int ret;
if (o_stream_bzlib_send_flush(zstream) < 0)
return -1;
- if (o_stream_flush(zstream->output) < 0) {
+ ret = o_stream_flush(zstream->output);
+ if (ret < 0)
zstream_copy_error(zstream);
- return -1;
- }
- return 0;
+ return ret;
}
static ssize_t
diff -ur dovecot-2.0.beta4/src/plugins/zlib/ostream-zlib.c dovecot-2.0.beta4+fix/src/plugins/zlib/ostream-zlib.c
--- dovecot-2.0.beta4/src/plugins/zlib/ostream-zlib.c 2010-02-18 22:01:56.000000000 -0600
+++ dovecot-2.0.beta4+fix/src/plugins/zlib/ostream-zlib.c 2010-04-20 19:15:29.000000000 -0500
@@ -184,15 +184,15 @@
static int o_stream_zlib_flush(struct ostream_private *stream)
{
struct zlib_ostream *zstream = (struct zlib_ostream *)stream;
+ int ret;
if (o_stream_zlib_send_flush(zstream) < 0)
return -1;
- if (o_stream_flush(zstream->output) < 0) {
+ ret = o_stream_flush(zstream->output);
+ if (ret < 0)
zstream_copy_error(zstream);
- return -1;
- }
- return 0;
+ return ret;
}
static ssize_t
More information about the dovecot
mailing list