[evolution-data-server] camel_service_ref_session() can return a NULL pointer
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] camel_service_ref_session() can return a NULL pointer
- Date: Wed, 18 Nov 2015 12:59:31 +0000 (UTC)
commit d2ed9d5e9080e6783e2203b7a184e3a23f4d6682
Author: Milan Crha <mcrha redhat com>
Date: Wed Nov 18 13:58:37 2015 +0100
camel_service_ref_session() can return a NULL pointer
...thus count with it in the code. The NULL can be returned for example
when the application is exiting.
camel/camel-folder-summary.c | 8 +++++
camel/camel-folder.c | 29 +++++++++++++-------
camel/camel-offline-folder.c | 3 ++
camel/camel-offline-store.c | 17 ++++-------
camel/camel-sasl-popb4smtp.c | 2 +
camel/camel-service.c | 13 +++++---
camel/camel-store.c | 10 +++++++
camel/camel-subscribable.c | 6 ++++
camel/camel-vee-folder.c | 2 +
camel/camel-vee-store.c | 16 ++++++-----
camel/providers/imapx/camel-imapx-conn-manager.c | 4 +-
camel/providers/imapx/camel-imapx-server.c | 21 +++++++++++---
camel/providers/imapx/camel-imapx-store.c | 18 +++++++-----
camel/providers/nntp/camel-nntp-store.c | 28 +++++++++++++++++--
camel/providers/pop3/camel-pop3-store.c | 2 +-
.../providers/sendmail/camel-sendmail-transport.c | 4 +-
camel/providers/smtp/camel-smtp-transport.c | 10 ++++++-
17 files changed, 138 insertions(+), 55 deletions(-)
---
diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c
index cc8f77b..94579dd 100644
--- a/camel/camel-folder-summary.c
+++ b/camel/camel-folder-summary.c
@@ -2136,6 +2136,14 @@ cfs_try_release_memory (CamelFolderSummary *summary)
parent_store = camel_folder_get_parent_store (summary->priv->folder);
session = camel_service_ref_session (CAMEL_SERVICE (parent_store));
+ if (!session) {
+ summary->priv->cache_load_time = 0;
+ summary->priv->timeout_handle = 0;
+ g_object_unref (summary);
+
+ return FALSE;
+ }
+
description = g_strdup_printf (_("Release unused memory for folder '%s'"), camel_folder_get_full_name
(summary->priv->folder));
camel_session_submit_job (
diff --git a/camel/camel-folder.c b/camel/camel-folder.c
index 7452a80..5b03833 100644
--- a/camel/camel-folder.c
+++ b/camel/camel-folder.c
@@ -1091,6 +1091,9 @@ folder_changed (CamelFolder *folder,
parent_store = camel_folder_get_parent_store (folder);
session = camel_service_ref_session (CAMEL_SERVICE (parent_store));
+ if (!session)
+ return;
+
junk_filter = camel_session_get_junk_filter (session);
if (junk_filter != NULL && info->uid_changed->len) {
@@ -2272,6 +2275,8 @@ camel_folder_delete (CamelFolder *folder)
service = CAMEL_SERVICE (parent_store);
session = camel_service_ref_session (service);
+ if (!session)
+ return;
signal_closure = g_slice_new0 (SignalClosure);
g_weak_ref_init (&signal_closure->folder, folder);
@@ -2325,6 +2330,8 @@ camel_folder_rename (CamelFolder *folder,
service = CAMEL_SERVICE (parent_store);
session = camel_service_ref_session (service);
+ if (!session)
+ return;
signal_closure = g_slice_new0 (SignalClosure);
g_weak_ref_init (&signal_closure->folder, folder);
@@ -2387,19 +2394,21 @@ camel_folder_changed (CamelFolder *folder,
service = CAMEL_SERVICE (parent_store);
session = camel_service_ref_session (service);
- pending_changes = camel_folder_change_info_new ();
- folder->priv->pending_changes = pending_changes;
+ if (session) {
+ pending_changes = camel_folder_change_info_new ();
+ folder->priv->pending_changes = pending_changes;
- signal_closure = g_slice_new0 (SignalClosure);
- g_weak_ref_init (&signal_closure->folder, folder);
+ signal_closure = g_slice_new0 (SignalClosure);
+ g_weak_ref_init (&signal_closure->folder, folder);
- camel_session_idle_add (
- session, G_PRIORITY_LOW,
- folder_emit_changed_cb,
- signal_closure,
- (GDestroyNotify) signal_closure_free);
+ camel_session_idle_add (
+ session, G_PRIORITY_LOW,
+ folder_emit_changed_cb,
+ signal_closure,
+ (GDestroyNotify) signal_closure_free);
- g_object_unref (session);
+ g_object_unref (session);
+ }
}
camel_folder_change_info_cat (pending_changes, changes);
diff --git a/camel/camel-offline-folder.c b/camel/camel-offline-folder.c
index 1e885f1..3bf2abc 100644
--- a/camel/camel-offline-folder.c
+++ b/camel/camel-offline-folder.c
@@ -237,6 +237,9 @@ offline_folder_changed (CamelFolder *folder,
service = CAMEL_SERVICE (parent_store);
session = camel_service_ref_session (service);
+ if (!session)
+ return;
+
settings = camel_service_ref_settings (service);
sync_store = camel_offline_settings_get_stay_synchronized (
diff --git a/camel/camel-offline-store.c b/camel/camel-offline-store.c
index 764278c..edec1ab 100644
--- a/camel/camel-offline-store.c
+++ b/camel/camel-offline-store.c
@@ -63,8 +63,8 @@ offline_store_constructed (GObject *object)
G_OBJECT_CLASS (camel_offline_store_parent_class)->constructed (object);
session = camel_service_ref_session (CAMEL_SERVICE (object));
- priv->online = camel_session_get_online (session);
- g_object_unref (session);
+ priv->online = session && camel_session_get_online (session);
+ g_clear_object (&session);
}
static void
@@ -226,7 +226,7 @@ camel_offline_store_set_online_sync (CamelOfflineStore *store,
CamelSession *session;
session = camel_service_ref_session (service);
- host_reachable = camel_session_get_online (session);
+ host_reachable = session && camel_session_get_online (session);
g_clear_object (&session);
}
@@ -284,7 +284,6 @@ camel_offline_store_prepare_for_offline_sync (CamelOfflineStore *store,
GError **error)
{
CamelService *service;
- CamelSession *session;
CamelSettings *settings;
gboolean host_reachable = TRUE;
gboolean store_is_online;
@@ -293,9 +292,9 @@ camel_offline_store_prepare_for_offline_sync (CamelOfflineStore *store,
g_return_val_if_fail (CAMEL_IS_OFFLINE_STORE (store), FALSE);
service = CAMEL_SERVICE (store);
- session = camel_service_ref_session (service);
+ store_is_online = camel_offline_store_get_online (store);
- if (CAMEL_IS_NETWORK_SERVICE (store)) {
+ if (store_is_online && CAMEL_IS_NETWORK_SERVICE (store)) {
/* Check with up-to-date value. The cached value is updated with
few seconds timeout, thus it can be stale here. */
host_reachable =
@@ -304,8 +303,6 @@ camel_offline_store_prepare_for_offline_sync (CamelOfflineStore *store,
cancellable, NULL);
}
- store_is_online = camel_offline_store_get_online (store);
-
settings = camel_service_ref_settings (service);
sync_store = camel_offline_settings_get_stay_synchronized (
@@ -313,8 +310,6 @@ camel_offline_store_prepare_for_offline_sync (CamelOfflineStore *store,
g_object_unref (settings);
- g_object_unref (session);
-
if (host_reachable && store_is_online) {
GPtrArray *folders;
guint ii;
@@ -398,7 +393,7 @@ camel_offline_store_requires_downsync (CamelOfflineStore *store)
CamelSession *session;
session = camel_service_ref_session (service);
- host_reachable = camel_session_get_online (session);
+ host_reachable = session && camel_session_get_online (session);
g_clear_object (&session);
}
diff --git a/camel/camel-sasl-popb4smtp.c b/camel/camel-sasl-popb4smtp.c
index 0b8f26c..5843a8f 100644
--- a/camel/camel-sasl-popb4smtp.c
+++ b/camel/camel-sasl-popb4smtp.c
@@ -74,6 +74,8 @@ sasl_popb4smtp_challenge_sync (CamelSasl *sasl,
service = camel_sasl_get_service (sasl);
session = camel_service_ref_session (service);
+ if (!session)
+ return NULL;
camel_sasl_set_authenticated (sasl, FALSE);
diff --git a/camel/camel-service.c b/camel/camel-service.c
index 4285a62..a34ca48 100644
--- a/camel/camel-service.c
+++ b/camel/camel-service.c
@@ -454,15 +454,18 @@ service_find_old_data_dir (CamelService *service)
}
session = camel_service_ref_session (service);
+ if (session) {
+ base_dir = camel_session_get_user_data_dir (session);
+ old_data_dir = g_build_filename (base_dir, path->str, NULL);
- base_dir = camel_session_get_user_data_dir (session);
- old_data_dir = g_build_filename (base_dir, path->str, NULL);
-
- g_object_unref (session);
+ g_object_unref (session);
+ } else {
+ old_data_dir = NULL;
+ }
g_string_free (path, TRUE);
- if (!g_file_test (old_data_dir, G_FILE_TEST_IS_DIR)) {
+ if (old_data_dir && !g_file_test (old_data_dir, G_FILE_TEST_IS_DIR)) {
g_free (old_data_dir);
old_data_dir = NULL;
}
diff --git a/camel/camel-store.c b/camel/camel-store.c
index 1514da2..1fb36e0 100644
--- a/camel/camel-store.c
+++ b/camel/camel-store.c
@@ -697,6 +697,8 @@ camel_store_folder_created (CamelStore *store,
g_return_if_fail (folder_info != NULL);
session = camel_service_ref_session (CAMEL_SERVICE (store));
+ if (!session)
+ return;
signal_closure = g_slice_new0 (SignalClosure);
g_weak_ref_init (&signal_closure->store, store);
@@ -735,6 +737,8 @@ camel_store_folder_deleted (CamelStore *store,
g_return_if_fail (folder_info != NULL);
session = camel_service_ref_session (CAMEL_SERVICE (store));
+ if (!session)
+ return;
signal_closure = g_slice_new0 (SignalClosure);
g_weak_ref_init (&signal_closure->store, store);
@@ -773,6 +777,8 @@ camel_store_folder_opened (CamelStore *store,
g_return_if_fail (CAMEL_IS_FOLDER (folder));
session = camel_service_ref_session (CAMEL_SERVICE (store));
+ if (!session)
+ return;
signal_closure = g_slice_new0 (SignalClosure);
g_weak_ref_init (&signal_closure->store, store);
@@ -814,6 +820,8 @@ camel_store_folder_renamed (CamelStore *store,
g_return_if_fail (folder_info != NULL);
session = camel_service_ref_session (CAMEL_SERVICE (store));
+ if (!session)
+ return;
signal_closure = g_slice_new0 (SignalClosure);
g_weak_ref_init (&signal_closure->store, store);
@@ -852,6 +860,8 @@ camel_store_folder_info_stale (CamelStore *store)
g_return_if_fail (CAMEL_IS_STORE (store));
session = camel_service_ref_session (CAMEL_SERVICE (store));
+ if (!session)
+ return;
g_mutex_lock (&store->priv->signal_emission_lock);
diff --git a/camel/camel-subscribable.c b/camel/camel-subscribable.c
index 25940d2..a33c3a8 100644
--- a/camel/camel-subscribable.c
+++ b/camel/camel-subscribable.c
@@ -564,6 +564,9 @@ camel_subscribable_folder_subscribed (CamelSubscribable *subscribable,
service = CAMEL_SERVICE (subscribable);
session = camel_service_ref_session (service);
+ if (!session)
+ return;
+
signal_closure = g_slice_new0 (SignalClosure);
g_weak_ref_init (&signal_closure->subscribable, subscribable);
signal_closure->folder_info = camel_folder_info_clone (folder_info);
@@ -604,6 +607,9 @@ camel_subscribable_folder_unsubscribed (CamelSubscribable *subscribable,
service = CAMEL_SERVICE (subscribable);
session = camel_service_ref_session (service);
+ if (!session)
+ return;
+
signal_closure = g_slice_new0 (SignalClosure);
g_weak_ref_init (&signal_closure->subscribable, subscribable);
signal_closure->folder_info = camel_folder_info_clone (folder_info);
diff --git a/camel/camel-vee-folder.c b/camel/camel-vee-folder.c
index ff2e5ed..afbf857 100644
--- a/camel/camel-vee-folder.c
+++ b/camel/camel-vee-folder.c
@@ -1120,6 +1120,8 @@ vee_folder_folder_changed (CamelVeeFolder *vee_folder,
folder = CAMEL_FOLDER (vee_folder);
parent_store = camel_folder_get_parent_store (folder);
session = camel_service_ref_session (CAMEL_SERVICE (parent_store));
+ if (!session)
+ return;
g_async_queue_lock (vee_folder->priv->change_queue);
diff --git a/camel/camel-vee-store.c b/camel/camel-vee-store.c
index 39ac7cd..75737dd 100644
--- a/camel/camel-vee-store.c
+++ b/camel/camel-vee-store.c
@@ -1021,13 +1021,15 @@ camel_vee_store_rebuild_unmatched_folder (CamelVeeStore *vstore,
service = CAMEL_SERVICE (vstore);
session = camel_service_ref_session (service);
- camel_session_submit_job (
- session, _("Updating Unmatched search folder"), (CamelSessionCallback)
- vee_store_rebuild_unmatched_folder,
- g_object_ref (vstore),
- g_object_unref);
-
- g_object_unref (session);
+ if (session) {
+ camel_session_submit_job (
+ session, _("Updating Unmatched search folder"), (CamelSessionCallback)
+ vee_store_rebuild_unmatched_folder,
+ g_object_ref (vstore),
+ g_object_unref);
+
+ g_object_unref (session);
+ }
} else {
vee_store_rebuild_unmatched_folder (NULL, cancellable, vstore, error);
}
diff --git a/camel/providers/imapx/camel-imapx-conn-manager.c
b/camel/providers/imapx/camel-imapx-conn-manager.c
index 49fc670..a383143 100644
--- a/camel/providers/imapx/camel-imapx-conn-manager.c
+++ b/camel/providers/imapx/camel-imapx-conn-manager.c
@@ -654,7 +654,7 @@ camel_imapx_conn_manager_ref_connection (CamelIMAPXConnManager *conn_man,
session = camel_service_ref_session (CAMEL_SERVICE (imapx_store));
if (camel_offline_store_get_online (CAMEL_OFFLINE_STORE (imapx_store)) &&
- camel_session_get_online (session)) {
+ session && camel_session_get_online (session)) {
g_mutex_lock (&conn_man->priv->pending_connections_lock);
if (cancellable) {
@@ -771,7 +771,7 @@ camel_imapx_conn_manager_ref_connection (CamelIMAPXConnManager *conn_man,
g_clear_error (&local_error);
} else {
- g_set_error (
+ g_set_error_literal (
&local_error, CAMEL_SERVICE_ERROR,
CAMEL_SERVICE_ERROR_UNAVAILABLE,
_("You must be working online to complete this operation"));
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index 84df7fd..bf42f43 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -1769,12 +1769,15 @@ imapx_untagged_ok_no_bad (CamelIMAPXServer *is,
service = CAMEL_SERVICE (store);
session = camel_service_ref_session (service);
- camel_session_user_alert (
- session, service,
- CAMEL_SESSION_ALERT_WARNING,
- alert_message);
+ if (session) {
+ camel_session_user_alert (
+ session, service,
+ CAMEL_SESSION_ALERT_WARNING,
+ alert_message);
+
+ g_object_unref (session);
+ }
- g_object_unref (session);
g_object_unref (store);
}
@@ -3022,6 +3025,14 @@ imapx_reconnect (CamelIMAPXServer *is,
service = CAMEL_SERVICE (store);
session = camel_service_ref_session (service);
+ if (!session) {
+ g_set_error_literal (
+ error, CAMEL_SERVICE_ERROR,
+ CAMEL_SERVICE_ERROR_UNAVAILABLE,
+ _("You must be working online to complete this operation"));
+ g_object_unref (store);
+ return FALSE;
+ }
settings = camel_service_ref_settings (service);
diff --git a/camel/providers/imapx/camel-imapx-store.c b/camel/providers/imapx/camel-imapx-store.c
index d426113..148d53b 100644
--- a/camel/providers/imapx/camel-imapx-store.c
+++ b/camel/providers/imapx/camel-imapx-store.c
@@ -1844,16 +1844,18 @@ imapx_store_get_folder_info_sync (CamelStore *store,
imapx_store->priv->last_refresh_time = time (NULL);
session = camel_service_ref_session (service);
- description = g_strdup_printf (_("Retrieving folder list for '%s'"),
camel_service_get_display_name (service));
+ if (session) {
+ description = g_strdup_printf (_("Retrieving folder list for '%s'"),
camel_service_get_display_name (service));
- camel_session_submit_job (
- session, description, (CamelSessionCallback)
- imapx_refresh_finfo,
- g_object_ref (store),
- (GDestroyNotify) g_object_unref);
+ camel_session_submit_job (
+ session, description, (CamelSessionCallback)
+ imapx_refresh_finfo,
+ g_object_ref (store),
+ (GDestroyNotify) g_object_unref);
- g_object_unref (session);
- g_free (description);
+ g_object_unref (session);
+ g_free (description);
+ }
}
}
diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c
index 00d2335..5d8184a 100644
--- a/camel/providers/nntp/camel-nntp-store.c
+++ b/camel/providers/nntp/camel-nntp-store.c
@@ -342,6 +342,13 @@ connect_to_server (CamelService *service,
nntp_store = CAMEL_NNTP_STORE (service);
session = camel_service_ref_session (service);
+ if (!session) {
+ g_set_error_literal (
+ error, CAMEL_SERVICE_ERROR,
+ CAMEL_SERVICE_ERROR_UNAVAILABLE,
+ _("You must be working online to complete this operation"));
+ return FALSE;
+ }
settings = camel_service_ref_settings (service);
@@ -2085,6 +2092,13 @@ camel_nntp_raw_command_auth (CamelNNTPStore *nntp_store,
service = CAMEL_SERVICE (nntp_store);
session = camel_service_ref_session (service);
+ if (!session) {
+ g_set_error_literal (
+ error, CAMEL_SERVICE_ERROR,
+ CAMEL_SERVICE_ERROR_UNAVAILABLE,
+ _("You must be working online to complete this operation"));
+ return -1;
+ }
retry = 0;
@@ -2217,9 +2231,17 @@ camel_nntp_command (CamelNNTPStore *nntp_store,
switch (ret) {
case NNTP_AUTH_REQUIRED:
session = camel_service_ref_session (service);
- success = camel_session_authenticate_sync (
- session, service, NULL, cancellable, error);
- g_object_unref (session);
+ if (session) {
+ success = camel_session_authenticate_sync (
+ session, service, NULL, cancellable, error);
+ g_object_unref (session);
+ } else {
+ success = FALSE;
+ g_set_error_literal (
+ error, CAMEL_SERVICE_ERROR,
+ CAMEL_SERVICE_ERROR_UNAVAILABLE,
+ _("You must be working online to complete this operation"));
+ }
if (!success) {
ret = -1;
diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c
index 42744c0..5b8e456 100644
--- a/camel/providers/pop3/camel-pop3-store.c
+++ b/camel/providers/pop3/camel-pop3-store.c
@@ -522,7 +522,7 @@ pop3_store_connect_sync (CamelService *service,
g_object_unref (settings);
- if (!camel_session_get_online (session)) {
+ if (!session || !camel_session_get_online (session)) {
g_set_error (
error, CAMEL_SERVICE_ERROR,
CAMEL_SERVICE_ERROR_UNAVAILABLE,
diff --git a/camel/providers/sendmail/camel-sendmail-transport.c
b/camel/providers/sendmail/camel-sendmail-transport.c
index 6753395..15c6288 100644
--- a/camel/providers/sendmail/camel-sendmail-transport.c
+++ b/camel/providers/sendmail/camel-sendmail-transport.c
@@ -145,8 +145,8 @@ sendmail_send_to_sync (CamelTransport *transport,
gboolean is_online;
session = camel_service_ref_session (CAMEL_SERVICE (transport));
- is_online = camel_session_get_online (session);
- g_object_unref (session);
+ is_online = session && camel_session_get_online (session);
+ g_clear_object (&session);
if (!is_online) {
g_set_error (
diff --git a/camel/providers/smtp/camel-smtp-transport.c b/camel/providers/smtp/camel-smtp-transport.c
index 00723a5..9a6877a 100644
--- a/camel/providers/smtp/camel-smtp-transport.c
+++ b/camel/providers/smtp/camel-smtp-transport.c
@@ -522,7 +522,7 @@ smtp_transport_connect_sync (CamelService *service,
success = connect_to_server (service, cancellable, error);
if (!success)
- return FALSE;
+ goto exit;
/* check to see if AUTH is required, if so...then AUTH ourselves */
auth_required =
@@ -535,6 +535,14 @@ smtp_transport_connect_sync (CamelService *service,
CamelSession *session;
session = camel_service_ref_session (service);
+ if (!session) {
+ success = FALSE;
+ g_set_error_literal (
+ error, CAMEL_SERVICE_ERROR,
+ CAMEL_SERVICE_ERROR_UNAVAILABLE,
+ _("You must be working online to complete this operation"));
+ goto exit;
+ }
if (g_hash_table_lookup (transport->authtypes, g_strcmp0 (mechanism, "Google") == 0 ?
"XOAUTH2" : mechanism)) {
gint tries = 0;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]