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.
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://mailman.fastxs.nl/cgi-bin/mailman/listinfo/dbmail-dev

Reply via email to