source_write_sync: Fail gracefully when given a scratch source.
authorMatthew Barnes <mbarnes@redhat.com>
Tue, 19 Feb 2013 14:18:47 +0000 (09:18 -0500)
committerMatthew Barnes <mbarnes@redhat.com>
Tue, 19 Feb 2013 14:18:47 +0000 (09:18 -0500)
Apparently e_dbus_object_get_source_writable() does not check its
argument for NULL, and scratch sources have no internal EDBusObject.

libedataserver/e-source.c

index cfb1977..9f340f6 100644 (file)
@@ -1005,16 +1005,20 @@ source_write_sync (ESource *source,
                    GCancellable *cancellable,
                    GError **error)
 {
-       EDBusObject *dbus_object;
-       EDBusSourceWritable *dbus_source;
+       EDBusSourceWritable *dbus_interface = NULL;
+       GDBusObject *dbus_object;
        gboolean success;
        gchar *data;
 
-       dbus_object = E_DBUS_OBJECT (source->priv->dbus_object);
-
-       dbus_source = e_dbus_object_get_source_writable (dbus_object);
+       dbus_object = e_source_ref_dbus_object (source);
+       if (dbus_object != NULL) {
+               dbus_interface =
+                       e_dbus_object_get_source_writable (
+                       E_DBUS_OBJECT (dbus_object));
+               g_object_unref (dbus_object);
+       }
 
-       if (dbus_source == NULL) {
+       if (dbus_interface == NULL) {
                g_set_error (
                        error, G_IO_ERROR,
                        G_IO_ERROR_PERMISSION_DENIED,
@@ -1026,11 +1030,11 @@ source_write_sync (ESource *source,
        data = e_source_to_string (source, NULL);
 
        success = e_dbus_source_writable_call_write_sync (
-               dbus_source, data, cancellable, error);
+               dbus_interface, data, cancellable, error);
 
        g_free (data);
 
-       g_object_unref (dbus_source);
+       g_object_unref (dbus_interface);
 
        return success;
 }