diff options
author | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2011-12-21 08:29:04 +0000 |
---|---|---|
committer | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2011-12-21 08:29:04 +0000 |
commit | eec5ddacba319421f04c85eb56c699d01a662327 (patch) | |
tree | bbe58d09a51a3d7db770836c0a475aac13b99b24 /libsylph/imap.c | |
parent | 94a1237c077d51149e3f1f6c1afd55bd7de0dacd (diff) |
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
Diffstat (limited to 'libsylph/imap.c')
-rw-r--r-- | libsylph/imap.c | 20 |
1 files changed, 17 insertions, 3 deletions
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); } |