From eec5ddacba319421f04c85eb56c699d01a662327 Mon Sep 17 00:00:00 2001 From: hiro Date: Wed, 21 Dec 2011 08:29:04 +0000 Subject: Fixed crash when message fetch and new message checking happen at the same time on IMAP folder. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@2992 ee746299-78ed-0310-b773-934348b2243d --- ChangeLog | 8 ++++++++ libsylph/imap.c | 20 +++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index a2f58b7c..85971db1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2011-12-21 + + * libsylph/imap.c: + imap_session_get() + imap_cmd_noop(): check the activity of session, and return NULL + if busy. This fixes crashes when message fetch and new message + checking happen at the same time. + 2011-12-16 * src/mainwindow.c: main_window_create(): force visibility of the diff --git a/libsylph/imap.c b/libsylph/imap.c index 5414d0ac..eb329076 100644 --- a/libsylph/imap.c +++ b/libsylph/imap.c @@ -512,6 +512,7 @@ static void imap_folder_init(Folder *folder, const gchar *name, static IMAPSession *imap_session_get(Folder *folder) { RemoteFolder *rfolder = REMOTE_FOLDER(folder); + gint ret; g_return_val_if_fail(folder != NULL, NULL); g_return_val_if_fail(FOLDER_TYPE(folder) == F_IMAP, NULL); @@ -528,12 +529,22 @@ static IMAPSession *imap_session_get(Folder *folder) return IMAP_SESSION(rfolder->session); } + if (imap_is_session_active(IMAP_FOLDER(folder))) { + g_warning("imap_session_get: session is busy."); + return NULL; + } + if (time(NULL) - rfolder->session->last_access_time < SESSION_TIMEOUT_INTERVAL) { return IMAP_SESSION(rfolder->session); } - if (imap_cmd_noop(IMAP_SESSION(rfolder->session)) != IMAP_SUCCESS) { + if ((ret = imap_cmd_noop(IMAP_SESSION(rfolder->session))) != IMAP_SUCCESS) { + if (ret == IMAP_EAGAIN) { + g_warning("imap_session_get: session is busy."); + return NULL; + } + log_warning(_("IMAP4 connection to %s has been" " disconnected. Reconnecting...\n"), folder->account->recv_server); @@ -3887,8 +3898,11 @@ static gint imap_cmd_logout(IMAPSession *session) static gint imap_cmd_noop(IMAPSession *session) { - if (imap_cmd_gen_send(session, "NOOP") != IMAP_SUCCESS) - return IMAP_ERROR; + gint ret; + + ret = imap_cmd_gen_send(session, "NOOP"); + if (ret != IMAP_SUCCESS) + return ret; return imap_cmd_ok(session, NULL); } -- cgit v1.2.3