Use g_dbus_interface_dup_object() and check return value
authorDavid Zeuthen <davidz@redhat.com>
Thu, 26 Jan 2012 22:53:54 +0000 (17:53 -0500)
committerDavid Zeuthen <davidz@redhat.com>
Thu, 26 Jan 2012 22:53:54 +0000 (17:53 -0500)
This fixes potential (multi-threading related) problems where the
GDBusObject is removed just before or in the middle of handling a
call. Also bump required GLib version to (unreleased) 2.31.13 since
that's the version this API was introduced in.

Signed-off-by: David Zeuthen <davidz@redhat.com>
13 files changed:
configure.ac
doc/udisks2-sections.txt
src/udisksdaemonutil.c
src/udisksdaemonutil.h
src/udiskslinuxblock.c
src/udiskslinuxdrive.c
src/udiskslinuxdriveata.c
src/udiskslinuxencrypted.c
src/udiskslinuxfilesystem.c
src/udiskslinuxloop.c
src/udiskslinuxpartition.c
src/udiskslinuxpartitiontable.c
src/udiskslinuxswapspace.c

index 4356e18..c03478c 100644 (file)
@@ -37,11 +37,11 @@ PKG_CHECK_MODULES(GUDEV, [gudev-1.0 >= 147])
 AC_SUBST(GUDEV_CFLAGS)
 AC_SUBST(GUDEV_LIBS)
 
-PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.31.0])
+PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.31.13])
 AC_SUBST(GLIB_CFLAGS)
 AC_SUBST(GLIB_LIBS)
 
-PKG_CHECK_MODULES(GIO, [gio-unix-2.0 >= 2.31.0])
+PKG_CHECK_MODULES(GIO, [gio-unix-2.0 >= 2.31.13])
 AC_SUBST(GIO_CFLAGS)
 AC_SUBST(GIO_LIBS)
 
index c0b3514..e52f22d 100644 (file)
@@ -326,6 +326,7 @@ udisks_daemon_util_resolve_links
 udisks_daemon_util_check_authorization_sync
 udisks_daemon_util_get_caller_uid_sync
 udisks_daemon_util_setup_by_user
+udisks_daemon_util_dup_object
 </SECTION>
 
 <SECTION>
index 699938c..b559730 100644 (file)
@@ -617,3 +617,35 @@ udisks_daemon_util_get_caller_uid_sync (UDisksDaemon            *daemon,
 }
 
 /* ---------------------------------------------------------------------------------------------------- */
+
+/**
+ * udisks_daemon_util_dup_object:
+ * @interface_: (type GDBusInterface): A #GDBusInterface<!-- -->-derived instance.
+ * @error: %NULL, or an unset #GError to set if the return value is %NULL.
+ *
+ * Gets the enclosing #UDisksObject for @interface, if any.
+ *
+ * Returns: (transfer full) (type UDisksObject): Either %NULL or a
+ * #UDisksObject<!-- -->-derived instance that must be released with
+ * g_object_unref().
+ */
+gpointer
+udisks_daemon_util_dup_object (gpointer   interface_,
+                               GError   **error)
+{
+  gpointer ret;
+
+  g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL);
+  g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+  ret = g_dbus_interface_dup_object (interface_);
+  if (ret == NULL)
+    {
+      g_set_error (error,
+                   UDISKS_ERROR,
+                   UDISKS_ERROR_FAILED,
+                   "No enclosing object for interface");
+    }
+
+  return ret;
+}
index eabfea0..fa8fbf9 100644 (file)
@@ -59,6 +59,9 @@ gboolean udisks_daemon_util_get_caller_uid_sync (UDisksDaemon            *daemon
                                                  gchar                  **out_user_name,
                                                  GError                 **error);
 
+gpointer  udisks_daemon_util_dup_object (gpointer   interface_,
+                                         GError   **error);
+
 G_END_DECLS
 
 #endif /* __UDISKS_DAEMON_UTIL_H__ */
index 38f5958..ba69f60 100644 (file)
@@ -790,7 +790,14 @@ handle_get_secret_configuration (UDisksBlock           *_block,
   GVariant *configuration;
   GError *error;
 
-  object = UDISKS_LINUX_BLOCK_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (block)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (block, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_block_object_get_daemon (object);
 
   error = NULL;
@@ -817,6 +824,7 @@ handle_get_secret_configuration (UDisksBlock           *_block,
                                                   configuration); /* consumes floating ref */
 
  out:
+  g_clear_object (&object);
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
 
@@ -1425,7 +1433,14 @@ handle_add_configuration_item (UDisksBlock           *_block,
   GVariant *details;
   GError *error;
 
-  object = UDISKS_LINUX_BLOCK_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (block)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (block, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_block_object_get_daemon (object);
 
   g_variant_get (item, "(&s@a{sv})", &type, &details);
@@ -1474,6 +1489,7 @@ handle_add_configuration_item (UDisksBlock           *_block,
 
  out:
   g_variant_unref (details);
+  g_clear_object (&object);
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
 
@@ -1492,7 +1508,14 @@ handle_remove_configuration_item (UDisksBlock           *_block,
   GVariant *details;
   GError *error;
 
-  object = UDISKS_LINUX_BLOCK_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (block)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (block, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_block_object_get_daemon (object);
 
   g_variant_get (item, "(&s@a{sv})", &type, &details);
@@ -1541,6 +1564,7 @@ handle_remove_configuration_item (UDisksBlock           *_block,
 
  out:
   g_variant_unref (details);
+  g_clear_object (&object);
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
 
@@ -1562,7 +1586,14 @@ handle_update_configuration_item (UDisksBlock           *_block,
   GVariant *new_details;
   GError *error;
 
-  object = UDISKS_LINUX_BLOCK_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (block)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (block, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_block_object_get_daemon (object);
 
   g_variant_get (old_item, "(&s@a{sv})", &old_type, &old_details);
@@ -1622,6 +1653,7 @@ handle_update_configuration_item (UDisksBlock           *_block,
  out:
   g_variant_unref (new_details);
   g_variant_unref (old_details);
+  g_clear_object (&object);
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
 
@@ -1792,7 +1824,14 @@ handle_format (UDisksBlock           *block,
   gchar *encrypt_passphrase = NULL;
   gchar *mapped_name = NULL;
 
-  object = UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (block)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (block, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   cleanup = udisks_daemon_get_cleanup (daemon);
   escaped_label = g_shell_quote("");
@@ -2113,6 +2152,7 @@ handle_format (UDisksBlock           *block,
   g_clear_object (&cleartext_block);
   g_clear_object (&udev_cleartext_device);
   g_free (wait_data);
+  g_clear_object (&object);
   return TRUE; /* returning true means that we handled the method invocation */
 }
 
@@ -2129,9 +2169,17 @@ handle_open_for_backup (UDisksBlock           *block,
   const gchar *action_id;
   const gchar *device;
   GUnixFDList *out_fd_list = NULL;
+  GError *error;
   gint fd;
 
-  object = UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (block)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (block, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
 
   action_id = "org.freedesktop.udisks2.open-device";
@@ -2162,6 +2210,7 @@ handle_open_for_backup (UDisksBlock           *block,
 
  out:
   g_clear_object (&out_fd_list);
+  g_clear_object (&object);
   return TRUE; /* returning true means that we handled the method invocation */
 }
 
@@ -2178,9 +2227,17 @@ handle_open_for_restore (UDisksBlock           *block,
   const gchar *action_id;
   const gchar *device;
   GUnixFDList *out_fd_list = NULL;
+  GError *error;
   gint fd;
 
-  object = UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (block)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (block, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
 
   action_id = "org.freedesktop.udisks2.open-device";
@@ -2211,6 +2268,7 @@ handle_open_for_restore (UDisksBlock           *block,
 
  out:
   g_clear_object (&out_fd_list);
+  g_clear_object (&object);
   return TRUE; /* returning true means that we handled the method invocation */
 }
 
index eb2ca08..326bc30 100644 (file)
@@ -680,12 +680,20 @@ handle_eject (UDisksDrive           *_drive,
   UDisksDaemon *daemon;
   const gchar *action_id;
   gchar *error_message;
+  GError *error;
 
   daemon = NULL;
   block = NULL;
   error_message = NULL;
 
-  object = UDISKS_LINUX_DRIVE_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (drive)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (drive, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_drive_object_get_daemon (object);
   block_object = udisks_linux_drive_object_get_block (object, TRUE);
   if (block_object == NULL)
@@ -738,6 +746,7 @@ handle_eject (UDisksDrive           *_drive,
   if (block_object != NULL)
     g_object_unref (block_object);
   g_free (error_message);
+  g_clear_object (&object);
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
 
index c837865..5145f74 100644 (file)
@@ -336,10 +336,10 @@ udisks_linux_drive_ata_refresh_smart_sync (UDisksLinuxDriveAta  *drive,
                                            GCancellable         *cancellable,
                                            GError              **error)
 {
-  UDisksLinuxDriveObject  *object;
+  UDisksLinuxDriveObject *object;
   GUdevDevice *device;
   gboolean ret;
-  SkDisk *d;
+  SkDisk *d = NULL;
   SkBool awake;
   SkBool good;
   uint64_t temp_mkelvin = 0;
@@ -348,7 +348,10 @@ udisks_linux_drive_ata_refresh_smart_sync (UDisksLinuxDriveAta  *drive,
   const SkSmartParsedData *data;
   ParseData parse_data;
 
-  object = UDISKS_LINUX_DRIVE_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (drive)));
+  object = udisks_daemon_util_dup_object (drive, error);
+  if (object == NULL)
+    goto out;
+
   device = udisks_linux_drive_object_get_device (object, TRUE /* get_hw */);
   g_assert (device != NULL);
 
@@ -481,6 +484,7 @@ udisks_linux_drive_ata_refresh_smart_sync (UDisksLinuxDriveAta  *drive,
   g_object_unref (device);
   if (d != NULL)
     sk_disk_free (d);
+  g_clear_object (&object);
   return ret;
 }
 
@@ -514,7 +518,10 @@ udisks_linux_drive_ata_smart_selftest_sync (UDisksLinuxDriveAta     *drive,
   gboolean ret = FALSE;
   SkSmartSelfTest test;
 
-  object = UDISKS_LINUX_DRIVE_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (drive)));
+  object = udisks_daemon_util_dup_object (drive, error);
+  if (object == NULL)
+    goto out;
+
   device = udisks_linux_drive_object_get_device (object, TRUE /* get_hw */);
   g_assert (device != NULL);
 
@@ -559,6 +566,7 @@ udisks_linux_drive_ata_smart_selftest_sync (UDisksLinuxDriveAta     *drive,
   g_object_unref (device);
   if (d != NULL)
     sk_disk_free (d);
+  g_clear_object (&object);
   return ret;
 }
 
@@ -579,7 +587,14 @@ handle_smart_update (UDisksDriveAta        *_drive,
 
   daemon = NULL;
 
-  object = UDISKS_LINUX_DRIVE_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (drive)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (drive, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_drive_object_get_daemon (object);
   block_object = udisks_linux_drive_object_get_block (object, TRUE);
   if (block_object == NULL)
@@ -662,6 +677,7 @@ handle_smart_update (UDisksDriveAta        *_drive,
  out:
   if (block_object != NULL)
     g_object_unref (block_object);
+  g_clear_object (&object);
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
 
@@ -705,7 +721,14 @@ handle_smart_selftest_abort (UDisksDriveAta        *_drive,
   UDisksLinuxDriveAta *drive = UDISKS_LINUX_DRIVE_ATA (_drive);
   GError *error;
 
-  object = UDISKS_LINUX_DRIVE_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (drive)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (drive, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_drive_object_get_daemon (object);
   block_object = udisks_linux_drive_object_get_block (object, TRUE);
   if (block_object == NULL)
@@ -773,6 +796,7 @@ handle_smart_selftest_abort (UDisksDriveAta        *_drive,
   udisks_drive_ata_complete_smart_selftest_abort (UDISKS_DRIVE_ATA (drive), invocation);
 
  out:
+  g_clear_object (&object);
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
 
@@ -788,7 +812,9 @@ selftest_job_func (UDisksThreadedJob  *job,
   UDisksLinuxDriveObject  *object;
   gboolean ret = FALSE;
 
-  object = UDISKS_LINUX_DRIVE_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (drive)));
+  object = udisks_daemon_util_dup_object (drive, error);
+  if (object == NULL)
+    goto out;
 
   while (TRUE)
     {
@@ -857,6 +883,7 @@ selftest_job_func (UDisksThreadedJob  *job,
   if (drive->selftest_cancellable != NULL)
     g_object_unref (drive->selftest_cancellable);
   G_UNLOCK (object_lock);
+  g_clear_object (&object);
   return ret;
 }
 
@@ -873,7 +900,14 @@ handle_smart_selftest_start (UDisksDriveAta        *_drive,
   UDisksLinuxDriveAta *drive = UDISKS_LINUX_DRIVE_ATA (_drive);
   GError *error;
 
-  object = UDISKS_LINUX_DRIVE_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (drive)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (drive, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_drive_object_get_daemon (object);
   block_object = udisks_linux_drive_object_get_block (object, TRUE);
   if (block_object == NULL)
@@ -944,6 +978,7 @@ handle_smart_selftest_start (UDisksDriveAta        *_drive,
   udisks_drive_ata_complete_smart_selftest_start (UDISKS_DRIVE_ATA (drive), invocation);
 
  out:
+  g_clear_object (&object);
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
 
index 2da9a4f..bf61dff 100644 (file)
@@ -249,7 +249,14 @@ handle_unlock (UDisksEncrypted        *encrypted,
   udev_cleartext_device = NULL;
   cleartext_object = NULL;
 
-  object = UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (encrypted)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (encrypted, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   block = udisks_object_peek_block (object);
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   cleanup = udisks_daemon_get_cleanup (daemon);
@@ -411,6 +418,7 @@ handle_unlock (UDisksEncrypted        *encrypted,
     g_object_unref (udev_cleartext_device);
   if (cleartext_object != NULL)
     g_object_unref (cleartext_object);
+  g_clear_object (&object);
 
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
@@ -446,7 +454,14 @@ handle_lock (UDisksEncrypted        *encrypted,
   cleartext_object = NULL;
   device = NULL;
 
-  object = UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (encrypted)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (encrypted, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   block = udisks_object_peek_block (object);
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   cleanup = udisks_daemon_get_cleanup (daemon);
@@ -557,6 +572,7 @@ handle_lock (UDisksEncrypted        *encrypted,
   g_free (error_message);
   if (cleartext_object != NULL)
     g_object_unref (cleartext_object);
+  g_clear_object (&object);
 
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
@@ -580,7 +596,14 @@ handle_change_passphrase (UDisksEncrypted        *encrypted,
   gchar *passphrases = NULL;
   GError *error;
 
-  object = UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (encrypted)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (encrypted, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   block = udisks_object_peek_block (object);
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
 
@@ -651,6 +674,7 @@ handle_change_passphrase (UDisksEncrypted        *encrypted,
  out:
   g_free (passphrases);
   g_free (error_message);
+  g_clear_object (&object);
 
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
index ea0024b..9b2469a 100644 (file)
@@ -917,7 +917,14 @@ handle_mount (UDisksFilesystem       *filesystem,
   caller_user_name = NULL;
   system_managed = FALSE;
 
-  object = UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (filesystem)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (filesystem, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   block = udisks_object_peek_block (object);
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   cleanup = udisks_daemon_get_cleanup (daemon);
@@ -1209,6 +1216,7 @@ handle_mount (UDisksFilesystem       *filesystem,
   g_free (mount_point_to_use);
   g_free (fstab_mount_options);
   g_free (caller_user_name);
+  g_clear_object (&object);
 
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
@@ -1255,7 +1263,14 @@ handle_unmount (UDisksFilesystem       *filesystem,
   error_message = NULL;
   opt_force = FALSE;
 
-  object = UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (filesystem)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (filesystem, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   block = udisks_object_peek_block (object);
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   cleanup = udisks_daemon_get_cleanup (daemon);
@@ -1430,6 +1445,7 @@ handle_unmount (UDisksFilesystem       *filesystem,
   g_free (escaped_mount_point);
   g_free (mount_point);
   g_free (fstab_mount_options);
+  g_clear_object (&object);
   return TRUE;
 }
 
@@ -1474,13 +1490,21 @@ handle_set_label (UDisksFilesystem       *filesystem,
   const gchar *action_id;
   gchar *command;
   gchar *tmp;
+  GError *error;
 
   object = NULL;
   daemon = NULL;
   escaped_label = NULL;
   command = NULL;
 
-  object = UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (filesystem)));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (filesystem, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   block = udisks_object_peek_block (object);
 
@@ -1590,6 +1614,7 @@ handle_set_label (UDisksFilesystem       *filesystem,
  out:
   g_free (escaped_label);
   g_free (command);
+  g_clear_object (&object);
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
 
index 5ed5d28..17fb02a 100644 (file)
@@ -174,7 +174,14 @@ handle_delete (UDisksLoop             *loop,
   error_message = NULL;
   escaped_device = NULL;
 
-  object = g_object_ref (UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (loop))));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (loop, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   block = udisks_object_peek_block (object);
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   cleanup = udisks_daemon_get_cleanup (daemon);
@@ -237,6 +244,7 @@ handle_delete (UDisksLoop             *loop,
   g_free (escaped_device);
   g_free (error_message);
   g_object_unref (object);
+  g_clear_object (&object);
 
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
index 0b84791..b627273 100644 (file)
@@ -224,8 +224,16 @@ handle_set_flags (UDisksPartition        *partition,
   UDisksBlock *partition_table_block = NULL;
   gchar *command_line = NULL;
   gint fd = -1;
+  GError *error;
+
+  error = NULL;
+  object = udisks_daemon_util_dup_object (partition, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
 
-  object = g_object_ref (UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (partition))));
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   block = udisks_object_get_block (object);
 
@@ -307,6 +315,7 @@ handle_set_flags (UDisksPartition        *partition,
   g_clear_object (&partition_table_object);
   g_clear_object (&partition_table);
   g_clear_object (&partition_table_block);
+  g_clear_object (&object);
 
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
@@ -332,8 +341,16 @@ handle_set_name (UDisksPartition        *partition,
   UDisksBlock *partition_table_block = NULL;
   gchar *command_line = NULL;
   gint fd = -1;
+  GError *error;
+
+  error = NULL;
+  object = udisks_daemon_util_dup_object (partition, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
 
-  object = g_object_ref (UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (partition))));
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   block = udisks_object_get_block (object);
 
@@ -421,6 +438,7 @@ handle_set_name (UDisksPartition        *partition,
   g_clear_object (&partition_table_object);
   g_clear_object (&partition_table);
   g_clear_object (&partition_table_block);
+  g_clear_object (&object);
 
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
@@ -477,8 +495,16 @@ handle_set_type (UDisksPartition        *partition,
   UDisksBlock *partition_table_block = NULL;
   gchar *command_line = NULL;
   gint fd = -1;
+  GError *error;
+
+  error = NULL;
+  object = udisks_daemon_util_dup_object (partition, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
 
-  object = g_object_ref (UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (partition))));
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   block = udisks_object_get_block (object);
 
@@ -591,6 +617,7 @@ handle_set_type (UDisksPartition        *partition,
   g_clear_object (&partition_table_object);
   g_clear_object (&partition_table);
   g_clear_object (&partition_table_block);
+  g_clear_object (&object);
 
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
@@ -613,8 +640,16 @@ handle_delete (UDisksPartition        *partition,
   UDisksPartitionTable *partition_table = NULL;
   UDisksBlock *partition_table_block = NULL;
   gchar *command_line = NULL;
+  GError *error;
+
+  error = NULL;
+  object = udisks_daemon_util_dup_object (partition, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
 
-  object = g_object_ref (UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (partition))));
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   block = udisks_object_get_block (object);
 
@@ -669,6 +704,7 @@ handle_delete (UDisksPartition        *partition,
   g_clear_object (&partition_table_object);
   g_clear_object (&partition_table);
   g_clear_object (&partition_table_block);
+  g_clear_object (&object);
 
   return TRUE; /* returning TRUE means that we handled the method invocation */
 }
index 104be36..ee640c4 100644 (file)
@@ -165,18 +165,17 @@ ranges_overlap (guint64 a_offset, guint64 a_size,
 
 static gboolean
 have_partition_in_range (UDisksPartitionTable     *table,
+                         UDisksObject             *object,
                          guint64                   start,
                          guint64                   end,
                          gboolean                  ignore_container)
 {
   gboolean ret = FALSE;
-  UDisksObject *object = NULL;
   UDisksDaemon *daemon = NULL;
   GDBusObjectManager *object_manager = NULL;
   const gchar *table_object_path;
   GList *objects = NULL, *l;
 
-  object = g_object_ref (UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (table))));
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   object_manager = G_DBUS_OBJECT_MANAGER (udisks_daemon_get_object_manager (daemon));
 
@@ -214,7 +213,6 @@ have_partition_in_range (UDisksPartitionTable     *table,
  out:
   g_list_foreach (objects, (GFunc) g_object_unref, NULL);
   g_list_free (objects);
-  g_clear_object (&object);
   return ret;
 }
 
@@ -288,7 +286,14 @@ handle_create_partition (UDisksPartitionTable   *table,
   const gchar *table_type;
   GError *error;
 
-  object = g_object_ref (UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (table))));
+  error = NULL;
+  object = udisks_daemon_util_dup_object (table, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
+
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   block = udisks_object_get_block (object);
   if (block == NULL)
@@ -335,7 +340,7 @@ handle_create_partition (UDisksPartitionTable   *table,
           (type_as_int == 0x05 || type_as_int == 0x0f || type_as_int == 0x85))
         {
           part_type = "extended";
-          if (have_partition_in_range (table, offset, offset + size, FALSE))
+          if (have_partition_in_range (table, object, offset, offset + size, FALSE))
             {
               g_dbus_method_invocation_return_error (invocation, UDISKS_ERROR, UDISKS_ERROR_FAILED,
                                                      "Requested range is already occupied by a partition");
@@ -344,9 +349,9 @@ handle_create_partition (UDisksPartitionTable   *table,
         }
       else
         {
-          if (have_partition_in_range (table, offset, offset + size, FALSE))
+          if (have_partition_in_range (table, object, offset, offset + size, FALSE))
             {
-              if (have_partition_in_range (table, offset, offset + size, TRUE))
+              if (have_partition_in_range (table, object, offset, offset + size, TRUE))
                 {
                   g_dbus_method_invocation_return_error (invocation, UDISKS_ERROR, UDISKS_ERROR_FAILED,
                                                          "Requested range is already occupied by a partition");
@@ -376,6 +381,7 @@ handle_create_partition (UDisksPartitionTable   *table,
        *  - exceeding the end of the disk
        */
       while (end_bytes > start_mib * MIB_SIZE && (have_partition_in_range (table,
+                                                                           object,
                                                                            start_mib * MIB_SIZE,
                                                                            end_bytes, is_logical) ||
                                                   end_bytes > udisks_block_get_size (block)))
@@ -403,7 +409,7 @@ handle_create_partition (UDisksPartitionTable   *table,
       gchar *escaped_escaped_name;
 
       /* GPT is easy, no extended/logical crap */
-      if (have_partition_in_range (table, offset, offset + size, FALSE))
+      if (have_partition_in_range (table, object, offset, offset + size, FALSE))
         {
           g_dbus_method_invocation_return_error (invocation, UDISKS_ERROR, UDISKS_ERROR_FAILED,
                                                  "Requested range is already occupied by a partition");
@@ -433,6 +439,7 @@ handle_create_partition (UDisksPartitionTable   *table,
        *  - exceeding the end of the disk (note: the 33 LBAs is the Secondary GPT)
        */
       while (end_bytes > start_mib * MIB_SIZE && (have_partition_in_range (table,
+                                                                           object,
                                                                            start_mib * MIB_SIZE,
                                                                            end_bytes, FALSE) ||
                                                   (end_bytes > udisks_block_get_size (block) - 33*512)))
index 161acdc..94391da 100644 (file)
@@ -158,8 +158,16 @@ handle_start (UDisksSwapspace        *swapspace,
   UDisksDaemon *daemon;
   UDisksBlock *block;
   UDisksBaseJob *job;
+  GError *error;
+
+  error = NULL;
+  object = udisks_daemon_util_dup_object (swapspace, &error);
+  if (object == NULL)
+    {
+      g_dbus_method_invocation_take_error (invocation, error);
+      goto out;
+    }
 
-  object = UDISKS_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (swapspace)));
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   block = udisks_object_peek_block (object);
 
@@ -185,6 +193,7 @@ handle_start (UDisksSwapspace        *swapspace,
                     invocation);
 
  out:
+  g_clear_object (&object);
   return TRUE;
 }