diff --git a/0003-crash-under-gs-flatpak-refine-app-unlocked.patch b/0003-crash-under-gs-flatpak-refine-app-unlocked.patch new file mode 100644 index 0000000..701e7ef --- /dev/null +++ b/0003-crash-under-gs-flatpak-refine-app-unlocked.patch @@ -0,0 +1,386 @@ +diff -up gnome-software-42.2/lib/gs-appstream.c.3 gnome-software-42.2/lib/gs-appstream.c +--- gnome-software-42.2/lib/gs-appstream.c.3 2022-06-13 14:34:05.477145977 +0200 ++++ gnome-software-42.2/lib/gs-appstream.c 2022-06-13 14:36:26.640218337 +0200 +@@ -20,7 +20,13 @@ GsApp * + gs_appstream_create_app (GsPlugin *plugin, XbSilo *silo, XbNode *component, GError **error) + { + GsApp *app; +- g_autoptr(GsApp) app_new = gs_app_new (NULL); ++ g_autoptr(GsApp) app_new = NULL; ++ ++ g_return_val_if_fail (GS_IS_PLUGIN (plugin), NULL); ++ g_return_val_if_fail (XB_IS_SILO (silo), NULL); ++ g_return_val_if_fail (XB_IS_NODE (component), NULL); ++ ++ app_new = gs_app_new (NULL); + + /* refine enough to get the unique ID */ + if (!gs_appstream_refine_app (plugin, app_new, silo, component, +@@ -967,6 +973,11 @@ gs_appstream_refine_app (GsPlugin *plugi + g_autoptr(GPtrArray) launchables = NULL; + g_autoptr(XbNode) req = NULL; + ++ g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE); ++ g_return_val_if_fail (GS_IS_APP (app), FALSE); ++ g_return_val_if_fail (XB_IS_SILO (silo), FALSE); ++ g_return_val_if_fail (XB_IS_NODE (component), FALSE); ++ + /* is compatible */ + req = xb_node_query_first (component, + "requires/id[@type='id']" +@@ -1411,6 +1422,11 @@ gs_appstream_search (GsPlugin *plugin, + { AS_SEARCH_TOKEN_MATCH_NONE, NULL } + }; + ++ g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE); ++ g_return_val_if_fail (XB_IS_SILO (silo), FALSE); ++ g_return_val_if_fail (values != NULL, FALSE); ++ g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); ++ + /* add some weighted queries */ + for (guint i = 0; queries[i].xpath != NULL; i++) { + g_autoptr(GError) error_query = NULL; +@@ -1487,6 +1503,11 @@ gs_appstream_add_category_apps (GsPlugin + { + GPtrArray *desktop_groups; + ++ g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE); ++ g_return_val_if_fail (XB_IS_SILO (silo), FALSE); ++ g_return_val_if_fail (GS_IS_CATEGORY (category), FALSE); ++ g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); ++ + desktop_groups = gs_category_get_desktop_groups (category); + if (desktop_groups->len == 0) { + g_warning ("no desktop_groups for %s", gs_category_get_id (category)); +@@ -1577,6 +1598,9 @@ gs_appstream_add_categories (XbSilo *sil + GCancellable *cancellable, + GError **error) + { ++ g_return_val_if_fail (XB_IS_SILO (silo), FALSE); ++ g_return_val_if_fail (list != NULL, FALSE); ++ + for (guint j = 0; j < list->len; j++) { + GsCategory *parent = GS_CATEGORY (g_ptr_array_index (list, j)); + GPtrArray *children = gs_category_get_children (parent); +@@ -1611,6 +1635,9 @@ gs_appstream_add_popular (XbSilo *silo, + g_autoptr(GError) error_local = NULL; + g_autoptr(GPtrArray) array = NULL; + ++ g_return_val_if_fail (XB_IS_SILO (silo), FALSE); ++ g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); ++ + /* find out how many packages are in each category */ + array = xb_silo_query (silo, + "components/component/kudos/" +@@ -1648,6 +1675,10 @@ gs_appstream_add_recent (GsPlugin *plugi + g_autoptr(GError) error_local = NULL; + g_autoptr(GPtrArray) array = NULL; + ++ g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE); ++ g_return_val_if_fail (XB_IS_SILO (silo), FALSE); ++ g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); ++ + /* use predicate conditions to the max */ + xpath = g_strdup_printf ("components/component/releases/" + "release[@timestamp>%" G_GUINT64_FORMAT "]/../..", +@@ -1686,6 +1717,10 @@ gs_appstream_add_alternates (XbSilo *sil + g_autoptr(GPtrArray) ids = NULL; + g_autoptr(GString) xpath = g_string_new (NULL); + ++ g_return_val_if_fail (XB_IS_SILO (silo), FALSE); ++ g_return_val_if_fail (GS_IS_APP (app), FALSE); ++ g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); ++ + /* probably a package we know nothing about */ + if (gs_app_get_id (app) == NULL) + return TRUE; +@@ -1743,6 +1778,9 @@ gs_appstream_add_featured (XbSilo *silo, + g_autoptr(GError) error_local = NULL; + g_autoptr(GPtrArray) array = NULL; + ++ g_return_val_if_fail (XB_IS_SILO (silo), FALSE); ++ g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); ++ + /* find out how many packages are in each category */ + array = xb_silo_query (silo, + "components/component/custom/value[@key='GnomeSoftware::FeatureTile']/../..|" +@@ -1782,6 +1820,11 @@ gs_appstream_url_to_app (GsPlugin *plugi + g_autofree gchar *xpath = NULL; + g_autoptr(GPtrArray) components = NULL; + ++ g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE); ++ g_return_val_if_fail (XB_IS_SILO (silo), FALSE); ++ g_return_val_if_fail (GS_IS_APP_LIST (list), FALSE); ++ g_return_val_if_fail (url != NULL, FALSE); ++ + /* not us */ + scheme = gs_utils_get_url_scheme (url); + if (g_strcmp0 (scheme, "appstream") != 0) +@@ -1812,6 +1855,9 @@ gs_appstream_component_add_keyword (XbBu + g_autoptr(XbBuilderNode) keyword = NULL; + g_autoptr(XbBuilderNode) keywords = NULL; + ++ g_return_if_fail (XB_IS_BUILDER_NODE (component)); ++ g_return_if_fail (str != NULL); ++ + /* create if it does not already exist */ + keywords = xb_builder_node_get_child (component, "keywords", NULL); + if (keywords == NULL) +@@ -1831,6 +1877,9 @@ gs_appstream_component_add_provide (XbBu + g_autoptr(XbBuilderNode) provide = NULL; + g_autoptr(XbBuilderNode) provides = NULL; + ++ g_return_if_fail (XB_IS_BUILDER_NODE (component)); ++ g_return_if_fail (str != NULL); ++ + /* create if it does not already exist */ + provides = xb_builder_node_get_child (component, "provides", NULL); + if (provides == NULL) +@@ -1850,6 +1899,9 @@ gs_appstream_component_add_category (XbB + g_autoptr(XbBuilderNode) category = NULL; + g_autoptr(XbBuilderNode) categories = NULL; + ++ g_return_if_fail (XB_IS_BUILDER_NODE (component)); ++ g_return_if_fail (str != NULL); ++ + /* create if it does not already exist */ + categories = xb_builder_node_get_child (component, "categories", NULL); + if (categories == NULL) +@@ -1868,6 +1920,9 @@ gs_appstream_component_add_icon (XbBuild + { + g_autoptr(XbBuilderNode) icon = NULL; + ++ g_return_if_fail (XB_IS_BUILDER_NODE (component)); ++ g_return_if_fail (str != NULL); ++ + /* create str if it does not already exist */ + icon = xb_builder_node_get_child (component, "icon", NULL); + if (icon == NULL) { +@@ -1881,7 +1936,11 @@ gs_appstream_component_add_icon (XbBuild + void + gs_appstream_component_add_extra_info (XbBuilderNode *component) + { +- const gchar *kind = xb_builder_node_get_attr (component, "type"); ++ const gchar *kind; ++ ++ g_return_if_fail (XB_IS_BUILDER_NODE (component)); ++ ++ kind = xb_builder_node_get_attr (component, "type"); + + /* add the gnome-software-specific 'Addon' group and ensure they + * all have an icon set */ +@@ -1927,9 +1986,14 @@ gs_appstream_component_add_extra_info (X + void + gs_appstream_component_fix_url (XbBuilderNode *component, const gchar *baseurl) + { +- const gchar *text = xb_builder_node_get_text (component); ++ const gchar *text; + g_autofree gchar *url = NULL; + ++ g_return_if_fail (XB_IS_BUILDER_NODE (component)); ++ g_return_if_fail (baseurl != NULL); ++ ++ text = xb_builder_node_get_text (component); ++ + if (text == NULL) + return; + +diff -up gnome-software-42.2/plugins/flatpak/gs-flatpak.c.3 gnome-software-42.2/plugins/flatpak/gs-flatpak.c +--- gnome-software-42.2/plugins/flatpak/gs-flatpak.c.3 2022-05-30 13:43:00.000000000 +0200 ++++ gnome-software-42.2/plugins/flatpak/gs-flatpak.c 2022-06-13 14:34:05.480145978 +0200 +@@ -467,10 +467,18 @@ gs_flatpak_create_source (GsFlatpak *sel + } + + static void ++gs_flatpak_invalidate_silo (GsFlatpak *self) ++{ ++ g_rw_lock_writer_lock (&self->silo_lock); ++ if (self->silo != NULL) ++ xb_silo_invalidate (self->silo); ++ g_rw_lock_writer_unlock (&self->silo_lock); ++} ++ ++static void + gs_flatpak_internal_data_changed (GsFlatpak *self) + { + g_autoptr(GMutexLocker) locker = NULL; +- g_autoptr(GRWLockWriterLocker) writer_locker = NULL; + + /* drop the installed refs cache */ + locker = g_mutex_locker_new (&self->installed_refs_mutex); +@@ -487,10 +495,7 @@ gs_flatpak_internal_data_changed (GsFlat + g_hash_table_remove_all (self->broken_remotes); + g_clear_pointer (&locker, g_mutex_locker_free); + +- writer_locker = g_rw_lock_writer_locker_new (&self->silo_lock); +- if (self->silo) +- xb_silo_invalidate (self->silo); +- g_clear_pointer (&writer_locker, g_rw_lock_writer_locker_free); ++ gs_flatpak_invalidate_silo (self); + + self->requires_full_rescan = TRUE; + } +@@ -2009,10 +2014,7 @@ gs_flatpak_refresh (GsFlatpak *self, + g_mutex_unlock (&self->installed_refs_mutex); + + /* manually do this in case we created the first appstream file */ +- g_rw_lock_reader_lock (&self->silo_lock); +- if (self->silo != NULL) +- xb_silo_invalidate (self->silo); +- g_rw_lock_reader_unlock (&self->silo_lock); ++ gs_flatpak_invalidate_silo (self); + + /* update AppStream metadata */ + if (!gs_flatpak_refresh_appstream (self, cache_age_secs, interactive, cancellable, error)) +@@ -3197,6 +3199,20 @@ gs_flatpak_refine_app_unlocked (GsFlatpa + + locker = g_rw_lock_reader_locker_new (&self->silo_lock); + ++ if (self->silo == NULL) { ++ g_clear_pointer (&locker, g_rw_lock_reader_locker_free); ++ if (!gs_flatpak_rescan_appstream_store (self, interactive, cancellable, error)) ++ return FALSE; ++ ++ locker = g_rw_lock_reader_locker_new (&self->silo_lock); ++ if (self->silo == NULL) { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "failed to setup XbSilo for '%s'", ++ gs_flatpak_get_id (self)); ++ return FALSE; ++ } ++ } ++ + /* always do AppStream properties */ + if (!gs_flatpak_refine_appstream (self, app, self->silo, flags, interactive, cancellable, error)) + return FALSE; +@@ -3394,6 +3410,13 @@ gs_flatpak_refine_wildcard (GsFlatpak *s + + locker = g_rw_lock_reader_locker_new (&self->silo_lock); + ++ if (self->silo == NULL) { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "failed to setup XbSilo for '%s'", ++ gs_flatpak_get_id (self)); ++ return FALSE; ++ } ++ + /* find all apps when matching any prefixes */ + xpath = g_strdup_printf ("components/component/id[text()='%s']/..", id); + components = xb_silo_query (self->silo, xpath, 0, &error_local); +@@ -3487,10 +3510,7 @@ gs_flatpak_app_remove_source (GsFlatpak + } + + /* invalidate cache */ +- g_rw_lock_reader_lock (&self->silo_lock); +- if (self->silo != NULL) +- xb_silo_invalidate (self->silo); +- g_rw_lock_reader_unlock (&self->silo_lock); ++ gs_flatpak_invalidate_silo (self); + + gs_app_set_state (app, is_remove ? GS_APP_STATE_UNAVAILABLE : GS_APP_STATE_AVAILABLE); + +@@ -3953,6 +3973,13 @@ gs_flatpak_search (GsFlatpak *self, + return FALSE; + + locker = g_rw_lock_reader_locker_new (&self->silo_lock); ++ if (self->silo == NULL) { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "failed to setup XbSilo for '%s'", ++ gs_flatpak_get_id (self)); ++ return FALSE; ++ } ++ + if (!gs_appstream_search (self->plugin, self->silo, values, list_tmp, + cancellable, error)) + return FALSE; +@@ -4022,6 +4049,12 @@ gs_flatpak_add_category_apps (GsFlatpak + return FALSE; + + locker = g_rw_lock_reader_locker_new (&self->silo_lock); ++ if (self->silo == NULL) { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "failed to setup XbSilo for '%s'", ++ gs_flatpak_get_id (self)); ++ return FALSE; ++ } + return gs_appstream_add_category_apps (self->plugin, self->silo, + category, list, + cancellable, error); +@@ -4040,6 +4073,12 @@ gs_flatpak_add_categories (GsFlatpak *se + return FALSE; + + locker = g_rw_lock_reader_locker_new (&self->silo_lock); ++ if (self->silo == NULL) { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "failed to setup XbSilo for '%s'", ++ gs_flatpak_get_id (self)); ++ return FALSE; ++ } + return gs_appstream_add_categories (self->silo, + list, cancellable, error); + } +@@ -4058,6 +4097,12 @@ gs_flatpak_add_popular (GsFlatpak *self, + return FALSE; + + locker = g_rw_lock_reader_locker_new (&self->silo_lock); ++ if (self->silo == NULL) { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "failed to setup XbSilo for '%s'", ++ gs_flatpak_get_id (self)); ++ return FALSE; ++ } + if (!gs_appstream_add_popular (self->silo, list_tmp, + cancellable, error)) + return FALSE; +@@ -4081,6 +4126,12 @@ gs_flatpak_add_featured (GsFlatpak *self + return FALSE; + + locker = g_rw_lock_reader_locker_new (&self->silo_lock); ++ if (self->silo == NULL) { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "failed to setup XbSilo for '%s'", ++ gs_flatpak_get_id (self)); ++ return FALSE; ++ } + if (!gs_appstream_add_featured (self->silo, list_tmp, + cancellable, error)) + return FALSE; +@@ -4105,6 +4156,12 @@ gs_flatpak_add_alternates (GsFlatpak *se + return FALSE; + + locker = g_rw_lock_reader_locker_new (&self->silo_lock); ++ if (self->silo == NULL) { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "failed to setup XbSilo for '%s'", ++ gs_flatpak_get_id (self)); ++ return FALSE; ++ } + if (!gs_appstream_add_alternates (self->silo, app, list_tmp, + cancellable, error)) + return FALSE; +@@ -4129,6 +4186,12 @@ gs_flatpak_add_recent (GsFlatpak *self, + return FALSE; + + locker = g_rw_lock_reader_locker_new (&self->silo_lock); ++ if (self->silo == NULL) { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "failed to setup XbSilo for '%s'", ++ gs_flatpak_get_id (self)); ++ return FALSE; ++ } + if (!gs_appstream_add_recent (self->plugin, self->silo, list_tmp, age, + cancellable, error)) + return FALSE; +@@ -4154,6 +4217,12 @@ gs_flatpak_url_to_app (GsFlatpak *self, + return FALSE; + + locker = g_rw_lock_reader_locker_new (&self->silo_lock); ++ if (self->silo == NULL) { ++ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, ++ "failed to setup XbSilo for '%s'", ++ gs_flatpak_get_id (self)); ++ return FALSE; ++ } + if (!gs_appstream_url_to_app (self->plugin, self->silo, list_tmp, url, cancellable, error)) + return FALSE; + diff --git a/gnome-software.spec b/gnome-software.spec index 61f0509..e2ed0ec 100644 --- a/gnome-software.spec +++ b/gnome-software.spec @@ -16,7 +16,7 @@ Name: gnome-software Version: 42.2 -Release: 1%{?dist} +Release: 2%{?dist} Summary: A software center for GNOME License: GPLv2+ @@ -25,6 +25,7 @@ Source0: https://download.gnome.org/sources/gnome-software/42/%{name}-%{tarbal Patch01: 0001-crash-with-broken-theme.patch Patch02: 0002-shell-setup-order.patch +Patch03: 0003-crash-under-gs-flatpak-refine-app-unlocked.patch BuildRequires: appstream-devel >= %{appstream_version} BuildRequires: gcc @@ -199,6 +200,9 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop %{_datadir}/gtk-doc/html/gnome-software %changelog +* Mon Jun 13 2022 Milan Crha - 42.2-2 +- Add patch for crash under gs_flatpak_refine_app_unlocked() + * Mon May 30 2022 Milan Crha - 42.2-1 - Update to 42.2 - Add patch to correct order of the setup of the GsShell