From bdfa6da37edd73eb566dcd75a5deb4311b58dfd6 Mon Sep 17 00:00:00 2001 From: Kevin Fenzi Date: Sat, 23 Feb 2019 12:09:06 -0800 Subject: [PATCH] Add https://gitlab.gnome.org/GNOME/gnome-control-center/merge_requests/387.patch to fix udisks crash --- 387.patch | 239 ++++++++++++++++++++++++++++++++++++++ gnome-control-center.spec | 10 +- 2 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 387.patch diff --git a/387.patch b/387.patch new file mode 100644 index 0000000..8b2b77e --- /dev/null +++ b/387.patch @@ -0,0 +1,239 @@ +diff --git a/meson.build b/meson.build +index bc8e20855..91599d445 100644 +--- a/meson.build ++++ b/meson.build +@@ -128,6 +128,7 @@ libxml_dep = dependency('libxml-2.0') + polkit_gobject_dep = dependency('polkit-gobject-1', version: '>= 0.103') + pulse_dep = dependency('libpulse', version: pulse_req_version) + pulse_mainloop_dep = dependency('libpulse-mainloop-glib', version: pulse_req_version) ++udisks2_dep = dependency('udisks2', version: '>= 2.1.8') + upower_glib_dep = dependency('upower-glib', version: '>= 0.99.8') + x11_dep = dependency('x11') + xi_dep = dependency('xi', version: '>= 1.2') +diff --git a/panels/info/cc-info-overview-panel.c b/panels/info/cc-info-overview-panel.c +index e2276a295..6a8e91841 100644 +--- a/panels/info/cc-info-overview-panel.c ++++ b/panels/info/cc-info-overview-panel.c +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + + #include + +@@ -81,9 +82,7 @@ typedef struct + + GCancellable *cancellable; + +- /* Free space */ +- GList *primary_mounts; +- guint64 total_bytes; ++ UDisksClient *client; + + GraphicsData *graphics_data; + } CcInfoOverviewPanelPrivate; +@@ -96,8 +95,6 @@ struct _CcInfoOverviewPanel + CcInfoOverviewPanelPrivate *priv; + }; + +-static void get_primary_disc_info_start (CcInfoOverviewPanel *self); +- + typedef struct + { + char *major; +@@ -486,111 +483,56 @@ get_os_type (void) + } + + static void +-query_done (GFile *file, +- GAsyncResult *res, +- CcInfoOverviewPanel *self) ++get_primary_disc_info (CcInfoOverviewPanel *self) + { ++ g_autoptr (GHashTable) added_drives = NULL; + CcInfoOverviewPanelPrivate *priv; +- g_autoptr(GFileInfo) info = NULL; +- g_autoptr(GError) error = NULL; ++ GDBusObjectManager *manager; ++ GList *objects, *l; ++ guint64 total_size; + +- info = g_file_query_filesystem_info_finish (file, res, &error); +- if (info != NULL) +- { +- priv = cc_info_overview_panel_get_instance_private (self); +- priv->total_bytes += g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE); +- } +- else +- { +- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) +- return; +- else +- { +- g_autofree char *path = NULL; +- path = g_file_get_path (file); +- g_warning ("Failed to get filesystem free space for '%s': %s", path, error->message); +- } +- } ++ priv = cc_info_overview_panel_get_instance_private (self); ++ total_size = 0; + +- /* And onto the next element */ +- get_primary_disc_info_start (self); +-} +- +-static void +-get_primary_disc_info_start (CcInfoOverviewPanel *self) +-{ +- GUnixMountEntry *mount; +- g_autoptr(GFile) file = NULL; +- CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); +- +- if (priv->primary_mounts == NULL) ++ if (!priv->client) + { +- g_autofree char *size = NULL; +- +- size = g_format_size (priv->total_bytes); +- gtk_label_set_text (GTK_LABEL (priv->disk_label), size); +- ++ gtk_label_set_text (GTK_LABEL (priv->disk_label), _("Unknown")); + return; + } + +- mount = priv->primary_mounts->data; +- priv->primary_mounts = g_list_remove (priv->primary_mounts, mount); +- file = g_file_new_for_path (g_unix_mount_get_mount_path (mount)); +- g_unix_mount_free (mount); +- +- g_file_query_filesystem_info_async (file, +- G_FILE_ATTRIBUTE_FILESYSTEM_SIZE, +- 0, +- priv->cancellable, +- (GAsyncReadyCallback) query_done, +- self); +-} ++ manager = udisks_client_get_object_manager (priv->client); ++ objects = g_dbus_object_manager_get_objects (manager); ++ added_drives = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); + +-static void +-get_primary_disc_info (CcInfoOverviewPanel *self) +-{ +- GList *points; +- GList *p; +- GHashTable *hash; +- CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); +- +- hash = g_hash_table_new (g_str_hash, g_str_equal); +- points = g_unix_mount_points_get (NULL); +- +- /* If we do not have /etc/fstab around, try /etc/mtab */ +- if (points == NULL) +- points = g_unix_mounts_get (NULL); +- +- for (p = points; p != NULL; p = p->next) ++ for (l = objects; l != NULL; l = l->next) + { +- GUnixMountEntry *mount = p->data; +- const char *mount_path; +- const char *device_path; +- +- mount_path = g_unix_mount_get_mount_path (mount); +- device_path = g_unix_mount_get_device_path (mount); +- +- /* Do not count multiple mounts with same device_path, because it is +- * probably something like btrfs subvolume. Use only the first one in +- * order to count the real size. */ +- if (gsd_should_ignore_unix_mount (mount) || +- gsd_is_removable_mount (mount) || +- g_str_has_prefix (mount_path, "/media/") || +- g_str_has_prefix (mount_path, g_get_home_dir ()) || +- g_hash_table_lookup (hash, device_path) != NULL) ++ UDisksDrive *drive; ++ drive = udisks_object_peek_drive (UDISKS_OBJECT (l->data)); ++ ++ /* Skip removable devices */ ++ if (drive == NULL || ++ udisks_drive_get_removable (drive) || ++ udisks_drive_get_ejectable (drive) || ++ g_hash_table_contains (added_drives, udisks_drive_get_id (drive))) + { +- g_unix_mount_free (mount); + continue; + } + +- priv->primary_mounts = g_list_prepend (priv->primary_mounts, mount); +- g_hash_table_insert (hash, (gpointer) device_path, (gpointer) device_path); ++ total_size += udisks_drive_get_size (drive); ++ g_hash_table_add (added_drives, (gpointer) udisks_drive_get_id (drive)); ++ } ++ ++ if (total_size > 0) ++ { ++ g_autofree gchar *size = g_format_size (total_size); ++ gtk_label_set_text (GTK_LABEL (priv->disk_label), size); ++ } ++ else ++ { ++ gtk_label_set_text (GTK_LABEL (priv->disk_label), _("Unknown")); + } +- g_list_free (points); +- g_hash_table_destroy (hash); + +- priv->cancellable = g_cancellable_new (); +- get_primary_disc_info_start (self); ++ g_list_free_full (objects, g_object_unref); + } + + static char * +@@ -852,8 +794,7 @@ cc_info_overview_panel_finalize (GObject *object) + g_clear_object (&priv->cancellable); + } + +- if (priv->primary_mounts) +- g_list_free_full (priv->primary_mounts, (GDestroyNotify) g_unix_mount_free); ++ g_clear_object (&priv->client); + + g_free (priv->gnome_version); + g_free (priv->gnome_date); +@@ -895,6 +836,7 @@ static void + cc_info_overview_panel_init (CcInfoOverviewPanel *self) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); ++ GError *error = NULL; + + gtk_widget_init_template (GTK_WIDGET (self)); + +@@ -907,6 +849,15 @@ cc_info_overview_panel_init (CcInfoOverviewPanel *self) + else + gtk_widget_destroy (priv->updates_button); + ++ priv->client = udisks_client_new_sync (NULL, &error); ++ ++ if (error != NULL) ++ { ++ g_warning ("Unable to get UDisks client: %s. Disk information will not be available.", ++ error->message); ++ g_error_free (error); ++ } ++ + info_overview_panel_setup_overview (self); + info_overview_panel_setup_virt (self); + } +diff --git a/panels/info/meson.build b/panels/info/meson.build +index 037425513..23abbda78 100644 +--- a/panels/info/meson.build ++++ b/panels/info/meson.build +@@ -61,6 +61,7 @@ sources += gnome.compile_resources( + + deps = common_deps + [ + polkit_gobject_dep, ++ udisks2_dep, + dependency('libgtop-2.0') + ] + +-- +2.18.1 + diff --git a/gnome-control-center.spec b/gnome-control-center.spec index 509be79..c8876a8 100644 --- a/gnome-control-center.spec +++ b/gnome-control-center.spec @@ -10,7 +10,7 @@ Name: gnome-control-center Version: 3.31.90 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Utilities to configure the GNOME desktop License: GPLv2+ and CC-BY-SA @@ -21,6 +21,9 @@ Source0: https://download.gnome.org/sources/gnome-control-center/3.31/gno Patch0: distro-logo.patch # https://gitlab.gnome.org/GNOME/gnome-control-center/merge_requests/214 Patch2: 0002-background-Add-queue-to-load-4-pictures-at-a-time.patch +# https://gitlab.gnome.org/GNOME/gnome-control-center/merge_requests/387 +# Fix for udisks crasher, already merged should be in the next upstream release. +Patch3: https://gitlab.gnome.org/GNOME/gnome-control-center/merge_requests/387.patch BuildRequires: chrpath BuildRequires: cups-devel @@ -66,6 +69,7 @@ BuildRequires: pkgconfig(smbclient) BuildRequires: pkgconfig(upower-glib) >= %{upower_version} BuildRequires: pkgconfig(x11) BuildRequires: pkgconfig(xi) +BuildRequires: pkgconfig(udisks2) %ifnarch s390 s390x BuildRequires: pkgconfig(gnome-bluetooth-1.0) >= %{gnome_bluetooth_version} BuildRequires: pkgconfig(libwacom) @@ -191,6 +195,10 @@ chrpath --delete $RPM_BUILD_ROOT%{_bindir}/gnome-control-center %dir %{_datadir}/gnome/wm-properties %changelog +* Sat Feb 23 2019 Kevin Fenzi - 3.31.90-2 +- Add https://gitlab.gnome.org/GNOME/gnome-control-center/merge_requests/387.patch + to fix udisks crash + * Thu Feb 07 2019 Kalev Lember - 3.31.90-1 - Update to 3.31.90