Merged update from upstream sources

This is an automated DistroBaker update from upstream sources.
If you do not know what this is about or would like to opt out,
contact the OSCI team.

Source: https://src.fedoraproject.org/rpms/fwupd.git#2874bb5cc706267e5d4b215e27097992146d6193
This commit is contained in:
DistroBaker 2020-11-21 03:03:39 +00:00
parent 28ae300828
commit e799affee6
2 changed files with 534 additions and 2 deletions

View File

@ -0,0 +1,526 @@
From 1a14d2be009ada386eba65ccd78feaa27853f109 Mon Sep 17 00:00:00 2001
From: Richard Hughes <richard@hughsie.com>
Date: Thu, 19 Nov 2020 13:19:54 +0000
Subject: [PATCH] Fix sync method when called from threads without a context
Set the thread-default context for the current thread before performing the
async operation.
Hopefully fixes https://github.com/fwupd/fwupd/issues/2600
---
libfwupd/fwupd-client-sync.c | 80 +++++++++++++++++++++++++++++++++++-
1 file changed, 79 insertions(+), 1 deletion(-)
diff --git a/libfwupd/fwupd-client-sync.c b/libfwupd/fwupd-client-sync.c
index 56068f6b..dab0a751 100644
--- a/libfwupd/fwupd-client-sync.c
+++ b/libfwupd/fwupd-client-sync.c
@@ -21,6 +21,7 @@ typedef struct {
gchar *str;
GError *error;
GPtrArray *array;
+ GMainContext *context;
GMainLoop *loop;
GVariant *val;
GHashTable *hash;
@@ -45,6 +46,7 @@ fwupd_client_helper_free (FwupdClientHelper *helper)
g_object_unref (helper->device);
g_free (helper->str);
g_main_loop_unref (helper->loop);
+ g_main_context_unref (helper->context);
g_free (helper);
}
@@ -53,7 +55,8 @@ fwupd_client_helper_new (void)
{
FwupdClientHelper *helper;
helper = g_new0 (FwupdClientHelper, 1);
- helper->loop = g_main_loop_new (NULL, FALSE);
+ helper->context = g_main_context_new ();
+ helper->loop = g_main_loop_new (helper->context, FALSE);
return helper;
}
@@ -94,8 +97,10 @@ fwupd_client_connect (FwupdClient *self, GCancellable *cancellable, GError **err
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_connect_async (self, cancellable, fwupd_client_connect_cb, helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -137,9 +142,11 @@ fwupd_client_get_devices (FwupdClient *self, GCancellable *cancellable, GError *
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_devices_async (self, cancellable,
fwupd_client_get_devices_cb, helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -181,9 +188,11 @@ fwupd_client_get_plugins (FwupdClient *self, GCancellable *cancellable, GError *
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_plugins_async (self, cancellable,
fwupd_client_get_plugins_cb, helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -225,9 +234,11 @@ fwupd_client_get_history (FwupdClient *self, GCancellable *cancellable, GError *
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_history_async (self, cancellable,
fwupd_client_get_history_cb, helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -272,9 +283,11 @@ fwupd_client_get_releases (FwupdClient *self, const gchar *device_id,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_releases_async (self, device_id, cancellable,
fwupd_client_get_releases_cb, helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -319,9 +332,11 @@ fwupd_client_get_downgrades (FwupdClient *self, const gchar *device_id,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_downgrades_async (self, device_id, cancellable,
fwupd_client_get_downgrades_cb, helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -366,9 +381,11 @@ fwupd_client_get_upgrades (FwupdClient *self, const gchar *device_id,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_upgrades_async (self, device_id, cancellable,
fwupd_client_get_upgrades_cb, helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -415,11 +432,13 @@ fwupd_client_get_details_bytes (FwupdClient *self,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_details_bytes_async (self, bytes,
cancellable,
fwupd_client_get_details_bytes_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -473,10 +492,12 @@ fwupd_client_get_details (FwupdClient *self,
istr = fwupd_unix_input_stream_from_fn (filename, error);
if (istr == NULL)
return NULL;
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_details_stream_async (self, istr, cancellable,
fwupd_client_get_details_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -530,10 +551,12 @@ fwupd_client_verify (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_verify_async (self, device_id, cancellable,
fwupd_client_verify_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -580,10 +603,12 @@ fwupd_client_verify_update (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_verify_update_async (self, device_id, cancellable,
fwupd_client_verify_update_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -630,10 +655,12 @@ fwupd_client_unlock (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_unlock_async (self, device_id, cancellable,
fwupd_client_unlock_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -683,11 +710,13 @@ fwupd_client_modify_config (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_modify_config_async (self, key, value,
cancellable,
fwupd_client_modify_config_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -735,11 +764,13 @@ fwupd_client_activate (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_activate_async (self, device_id,
cancellable,
fwupd_client_activate_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -786,11 +817,13 @@ fwupd_client_clear_results (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_clear_results_async (self, device_id,
cancellable,
fwupd_client_clear_results_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -835,9 +868,11 @@ fwupd_client_get_results (FwupdClient *self, const gchar *device_id,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_results_async (self, device_id, cancellable,
fwupd_client_get_results_cb, helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->device == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -881,10 +916,12 @@ fwupd_client_get_host_security_attrs (FwupdClient *self,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_host_security_attrs_async (self, cancellable,
fwupd_client_get_host_security_attrs_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -931,10 +968,12 @@ fwupd_client_get_device_by_id (FwupdClient *self,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_device_by_id_async (self, device_id, cancellable,
fwupd_client_get_device_by_id_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->device == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -980,10 +1019,12 @@ fwupd_client_get_devices_by_guid (FwupdClient *self, const gchar *guid,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_devices_by_guid_async (self, guid, cancellable,
fwupd_client_get_devices_by_guid_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -1044,11 +1085,13 @@ fwupd_client_install (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_install_stream_async (self, device_id, istr, filename,
install_flags, cancellable,
fwupd_client_install_fd_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -1107,11 +1150,13 @@ fwupd_client_install_bytes (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_install_bytes_async (self, device_id, bytes, install_flags,
cancellable,
fwupd_client_install_bytes_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -1162,11 +1207,13 @@ fwupd_client_install_release (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_install_release_async (self, device, release,
install_flags, cancellable,
fwupd_client_install_release_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -1236,10 +1283,12 @@ fwupd_client_update_metadata (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_update_metadata_stream_async (self, remote_id, istr, istr_sig, cancellable,
fwupd_client_update_metadata_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -1304,11 +1353,13 @@ fwupd_client_update_metadata_bytes (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_update_metadata_bytes_async (self, remote_id, metadata, signature,
cancellable,
fwupd_client_update_metadata_bytes_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -1353,10 +1404,13 @@ fwupd_client_refresh_remote (FwupdClient *self,
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+ /* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_refresh_remote_async (self, remote, cancellable,
fwupd_client_refresh_remote_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -1411,11 +1465,13 @@ fwupd_client_modify_remote (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_modify_remote_async (self, remote_id, key, value,
cancellable,
fwupd_client_modify_remote_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -1459,10 +1515,12 @@ fwupd_client_get_report_metadata (FwupdClient *self,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_report_metadata_async (self, cancellable,
fwupd_client_get_report_metadata_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->hash == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -1518,11 +1576,13 @@ fwupd_client_modify_device (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_modify_device_async (self, device_id, key, value,
cancellable,
fwupd_client_modify_device_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -1564,9 +1624,11 @@ fwupd_client_get_remotes (FwupdClient *self, GCancellable *cancellable, GError *
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_remotes_async (self, cancellable,
fwupd_client_get_remotes_cb, helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -1667,10 +1729,12 @@ fwupd_client_get_approved_firmware (FwupdClient *self,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_approved_firmware_async (self, cancellable,
fwupd_client_get_approved_firmware_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -1722,10 +1786,12 @@ fwupd_client_set_approved_firmware (FwupdClient *self,
g_ptr_array_add (array, g_strdup (checksums[i]));
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_set_approved_firmware_async (self, array, cancellable,
fwupd_client_set_approved_firmware_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -1770,10 +1836,12 @@ fwupd_client_get_blocked_firmware (FwupdClient *self,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_get_blocked_firmware_async (self, cancellable,
fwupd_client_get_blocked_firmware_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->array == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -1829,10 +1897,12 @@ fwupd_client_set_blocked_firmware (FwupdClient *self,
g_ptr_array_add (array, g_strdup (checksums[i]));
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_set_blocked_firmware_async (self, array, cancellable,
fwupd_client_set_blocked_firmware_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -1882,10 +1952,12 @@ fwupd_client_set_feature_flags (FwupdClient *self,
return FALSE;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_set_feature_flags_async (self, feature_flags, cancellable,
fwupd_client_set_feature_flags_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (!helper->ret) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return FALSE;
@@ -1934,10 +2006,12 @@ fwupd_client_self_sign (FwupdClient *self,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_self_sign_async (self, value, flags, cancellable,
fwupd_client_self_sign_cb,
helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->str == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -1988,9 +2062,11 @@ fwupd_client_download_bytes (FwupdClient *self,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_download_bytes_async (self, url, flags, cancellable,
fwupd_client_download_bytes_cb, helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->bytes == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
@@ -2095,9 +2171,11 @@ fwupd_client_upload_bytes (FwupdClient *self,
return NULL;
/* call async version and run loop until complete */
+ g_main_context_push_thread_default (helper->context);
fwupd_client_upload_bytes_async (self, url, payload, signature, flags, cancellable,
fwupd_client_upload_bytes_cb, helper);
g_main_loop_run (helper->loop);
+ g_main_context_pop_thread_default (helper->context);
if (helper->bytes == NULL) {
g_propagate_error (error, g_steal_pointer (&helper->error));
return NULL;
--
2.29.2

View File

@ -49,10 +49,13 @@
Summary: Firmware update daemon
Name: fwupd
Version: 1.5.1
Release: 1%{?dist}
Release: 2%{?dist}
License: LGPLv2+
URL: https://github.com/fwupd/fwupd
Source0: http://people.freedesktop.org/~hughsient/releases/%{name}-%{version}.tar.xz
# Backport of https://github.com/fwupd/fwupd/pull/2605
# Fixes https://github.com/fwupd/fwupd/issues/2600
Patch0: 0001-Fix-sync-method-when-called-from-threads-without-a-c.patch
BuildRequires: gettext
BuildRequires: glib2-devel >= %{glib2_version}
@ -484,7 +487,10 @@ mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/cache/fwupd
%endif
%changelog
* Mon Nov 01 2020 Richard Hughes <richard@hughsie.com> 1.5.2-1
* Fri Nov 20 2020 Adam Williamson <awilliam@redhat.com> - 1.5.1-2
- Backport #2605 for #2600, seems to help RHBZ #1896540
* Mon Nov 01 2020 Richard Hughes <richard@hughsie.com> 1.5.1-1
- New upstream release
- Delete unused EFI variables when deploying firmware
- Fix probe warning for the Logitech Unifying device