From 1338c8f47b7ebd0e3bd360499c7ab42a0da885e8 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Tue, 5 Oct 2021 16:12:33 +0200 Subject: [PATCH 1/2] packagekit: Update GsApp state and kind only when created the app instance The gs_plugin_packagekit_add_results() can reuse GsApp instances from the plugin cache, which can already have set property state and kind, but this was not checked for, which could cause runtime warnings about invalid state or kind change. A reproducer is to open Repositories dialog, which lists available repositories and the applications being installed in each of them (added as 'related'). These installed applications can have set state 'updatable' or have refined their 'kind' already. --- plugins/packagekit/packagekit-common.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/plugins/packagekit/packagekit-common.c b/plugins/packagekit/packagekit-common.c index 16b53727a..dc79c2f62 100644 --- a/plugins/packagekit/packagekit-common.c +++ b/plugins/packagekit/packagekit-common.c @@ -241,12 +241,14 @@ gs_plugin_packagekit_add_results (GsPlugin *plugin, /* process packages */ for (i = 0; i < array_filtered->len; i++) { g_autoptr(GsApp) app = NULL; + GsAppState state = GS_APP_STATE_UNKNOWN; package = g_ptr_array_index (array_filtered, i); app = gs_plugin_cache_lookup (plugin, pk_package_get_id (package)); if (app == NULL) { app = gs_app_new (NULL); gs_plugin_packagekit_set_packaging_format (plugin, app); + gs_app_set_management_plugin (app, "packagekit"); gs_app_add_source (app, pk_package_get_name (package)); gs_app_add_source_id (app, pk_package_get_id (package)); gs_plugin_cache_add (plugin, pk_package_get_id (package), app); @@ -259,14 +261,13 @@ gs_plugin_packagekit_add_results (GsPlugin *plugin, pk_package_get_summary (package)); gs_app_set_metadata (app, "GnomeSoftware::Creator", gs_plugin_get_name (plugin)); - gs_app_set_management_plugin (app, "packagekit"); gs_app_set_version (app, pk_package_get_version (package)); switch (pk_package_get_info (package)) { case PK_INFO_ENUM_INSTALLED: - gs_app_set_state (app, GS_APP_STATE_INSTALLED); + state = GS_APP_STATE_INSTALLED; break; case PK_INFO_ENUM_AVAILABLE: - gs_app_set_state (app, GS_APP_STATE_AVAILABLE); + state = GS_APP_STATE_AVAILABLE; break; case PK_INFO_ENUM_INSTALLING: case PK_INFO_ENUM_UPDATING: @@ -276,14 +277,16 @@ gs_plugin_packagekit_add_results (GsPlugin *plugin, break; case PK_INFO_ENUM_UNAVAILABLE: case PK_INFO_ENUM_REMOVING: - gs_app_set_state (app, GS_APP_STATE_UNAVAILABLE); + state = GS_APP_STATE_UNAVAILABLE; break; default: - gs_app_set_state (app, GS_APP_STATE_UNKNOWN); g_warning ("unknown info state of %s", pk_info_enum_to_string (pk_package_get_info (package))); } - gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); + if (state != GS_APP_STATE_UNKNOWN && gs_app_get_state (app) == GS_APP_STATE_UNKNOWN) + gs_app_set_state (app, state); + if (gs_app_get_kind (app) == AS_COMPONENT_KIND_UNKNOWN) + gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC); gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE); gs_app_list_add (list, app); } -- GitLab From 18a893fa83ebd10cea75831e9d9a7398a60c14ce Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Tue, 5 Oct 2021 16:18:22 +0200 Subject: [PATCH 2/2] gs-plugin-loader: Ensure correct list is used on the job when refining wildcards The plugin job is reused when refining the apps, including the wildcards, but the gs_plugin_loader_run_refine_internal() can be called multiple times, with different lists. Adding refined wildcards to the original list causes invalid data being provided to the called. Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1485 --- lib/gs-plugin-loader.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/gs-plugin-loader.c b/lib/gs-plugin-loader.c index 4d5240c32..7f5859a05 100644 --- a/lib/gs-plugin-loader.c +++ b/lib/gs-plugin-loader.c @@ -937,14 +937,24 @@ gs_plugin_loader_run_refine_internal (GsPluginLoaderHelper *helper, GCancellable *cancellable, GError **error) { + g_autoptr(GsAppList) previous_list = NULL; + + if (list != gs_plugin_job_get_list (helper->plugin_job)) { + previous_list = g_object_ref (gs_plugin_job_get_list (helper->plugin_job)); + gs_plugin_job_set_list (helper->plugin_job, list); + } + /* try to adopt each application with a plugin */ gs_plugin_loader_run_adopt (helper->plugin_loader, list); /* run each plugin */ if (!gs_plugin_loader_run_refine_filter (helper, list, GS_PLUGIN_REFINE_FLAGS_DEFAULT, - cancellable, error)) + cancellable, error)) { + if (previous_list != NULL) + gs_plugin_job_set_list (helper->plugin_job, previous_list); return FALSE; + } /* ensure these are sorted by score */ if (gs_plugin_job_has_refine_flags (helper->plugin_job, @@ -983,6 +993,8 @@ gs_plugin_loader_run_refine_internal (GsPluginLoaderHelper *helper, addons_list, cancellable, error)) { + if (previous_list != NULL) + gs_plugin_job_set_list (helper->plugin_job, previous_list); return FALSE; } } @@ -1004,6 +1016,8 @@ gs_plugin_loader_run_refine_internal (GsPluginLoaderHelper *helper, list2, cancellable, error)) { + if (previous_list != NULL) + gs_plugin_job_set_list (helper->plugin_job, previous_list); return FALSE; } } @@ -1032,11 +1046,16 @@ gs_plugin_loader_run_refine_internal (GsPluginLoaderHelper *helper, related_list, cancellable, error)) { + if (previous_list != NULL) + gs_plugin_job_set_list (helper->plugin_job, previous_list); return FALSE; } } } + if (previous_list != NULL) + gs_plugin_job_set_list (helper->plugin_job, previous_list); + /* success */ return TRUE; } -- GitLab