aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2011-12-21 08:29:04 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2011-12-21 08:29:04 +0000
commiteec5ddacba319421f04c85eb56c699d01a662327 (patch)
treebbe58d09a51a3d7db770836c0a475aac13b99b24
parent94a1237c077d51149e3f1f6c1afd55bd7de0dacd (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
-rw-r--r--ChangeLog8
-rw-r--r--libsylph/imap.c20
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);
}