infinite loop on connection close
Sergej Pupykin <[email protected]> Mon, 24 Feb 2014 20:31:07 +0400
| Newsgroups | gmane.mail.imap.dbmail.devel |
|---|---|
| Message-ID | <87bnxw5v78.wl%[email protected]> |
Hi,
I believe following code makes dead loop because of cb_leave ==
imap_cleanup_deferred and "do {} while" loop in dm_queue_drain never
exits.
imap4.c:
void imap_cleanup_deferred(gpointer data)
{
int rx;
dm_thread_data *D = (dm_thread_data *)data;
ImapSession *session = (ImapSession *)D->session;
ClientBase_T *ci = session->ci;
if (ci->rev) event_del(ci->rev);
if (client_wbuf_len(ci) && (! (ci->client_state & CLIENT_ERR))) {
ci_write_cb(ci);
dm_queue_push(imap_cleanup_deferred, session, NULL);
return;
}
server.c:
void dm_queue_drain(void)
{
gpointer data;
do {
data = g_async_queue_try_pop(queue);
if (data) {
dm_thread_data *D = (gpointer)data;
if (D->cb_leave) D->cb_leave(data);
dm_thread_data_free(data);
}
} while (data);
(current dbmail-3.1 branch)
Not sure if I am right, but my imapd sometimes hangs eating 1 cpu and
writing "Q" with EAGAIN error, because of noone reads another side of
pipe.