[evolution-data-server] camel_service_ref_session() can return a NULL pointer



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]