From 0b6f58394ba5edaa8c2c024c5e891de9476d0d40 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Tue, 1 Sep 2020 20:15:02 +0100 Subject: [PATCH] Cancel the file monitor before disposal to avoid a potential deadlock Fixes https://github.com/fwupd/fwupd/issues/2350 --- plugins/linux-lockdown/fu-plugin-linux-lockdown.c | 4 +++- plugins/linux-swap/fu-plugin-linux-swap.c | 4 +++- plugins/linux-tainted/fu-plugin-linux-tainted.c | 4 +++- plugins/thunderbolt/fu-self-test.c | 2 ++ src/fu-config.c | 4 +++- src/fu-main.c | 4 +++- src/fu-remote-list.c | 9 ++++++++- 7 files changed, 25 insertions(+), 6 deletions(-) diff --git a/plugins/linux-lockdown/fu-plugin-linux-lockdown.c b/plugins/linux-lockdown/fu-plugin-linux-lockdown.c index ccfdefe40..633feec2c 100644 --- a/plugins/linux-lockdown/fu-plugin-linux-lockdown.c +++ b/plugins/linux-lockdown/fu-plugin-linux-lockdown.c @@ -27,8 +27,10 @@ fu_plugin_destroy (FuPlugin *plugin) FuPluginData *data = fu_plugin_get_data (plugin); if (data->file != NULL) g_object_unref (data->file); - if (data->monitor != NULL) + if (data->monitor != NULL) { + g_file_monitor_cancel (data->monitor); g_object_unref (data->monitor); + } } static void diff --git a/plugins/linux-swap/fu-plugin-linux-swap.c b/plugins/linux-swap/fu-plugin-linux-swap.c index a92d86de2..b0f11edca 100644 --- a/plugins/linux-swap/fu-plugin-linux-swap.c +++ b/plugins/linux-swap/fu-plugin-linux-swap.c @@ -28,8 +28,10 @@ fu_plugin_destroy (FuPlugin *plugin) FuPluginData *data = fu_plugin_get_data (plugin); if (data->file != NULL) g_object_unref (data->file); - if (data->monitor != NULL) + if (data->monitor != NULL) { + g_file_monitor_cancel (data->monitor); g_object_unref (data->monitor); + } } static void diff --git a/plugins/linux-tainted/fu-plugin-linux-tainted.c b/plugins/linux-tainted/fu-plugin-linux-tainted.c index 86c69655e..6100edef4 100644 --- a/plugins/linux-tainted/fu-plugin-linux-tainted.c +++ b/plugins/linux-tainted/fu-plugin-linux-tainted.c @@ -27,8 +27,10 @@ fu_plugin_destroy (FuPlugin *plugin) FuPluginData *data = fu_plugin_get_data (plugin); if (data->file != NULL) g_object_unref (data->file); - if (data->monitor != NULL) + if (data->monitor != NULL) { + g_file_monitor_cancel (data->monitor); g_object_unref (data->monitor); + } } static void diff --git a/plugins/thunderbolt/fu-self-test.c b/plugins/thunderbolt/fu-self-test.c index c3414c436..90d2105f8 100644 --- a/plugins/thunderbolt/fu-self-test.c +++ b/plugins/thunderbolt/fu-self-test.c @@ -672,6 +672,8 @@ update_context_free (UpdateContext *ctx) if (ctx == NULL) return; + g_file_monitor_cancel (ctx->monitor); + g_object_unref (ctx->bed); g_object_unref (ctx->plugin); g_object_unref (ctx->monitor); diff --git a/src/fu-config.c b/src/fu-config.c index 646940c03..07114402e 100644 --- a/src/fu-config.c +++ b/src/fu-config.c @@ -313,8 +313,10 @@ fu_config_finalize (GObject *obj) { FuConfig *self = FU_CONFIG (obj); - if (self->monitor != NULL) + if (self->monitor != NULL) { + g_file_monitor_cancel (self->monitor); g_object_unref (self->monitor); + } g_ptr_array_unref (self->disabled_devices); g_ptr_array_unref (self->disabled_plugins); g_ptr_array_unref (self->approved_firmware); diff --git a/src/fu-main.c b/src/fu-main.c index c19edba38..cb2ccf5e6 100644 --- a/src/fu-main.c +++ b/src/fu-main.c @@ -1678,8 +1678,10 @@ fu_main_private_free (FuMainPrivate *priv) g_object_unref (priv->connection); if (priv->authority != NULL) g_object_unref (priv->authority); - if (priv->argv0_monitor != NULL) + if (priv->argv0_monitor != NULL) { + g_file_monitor_cancel (priv->argv0_monitor); g_object_unref (priv->argv0_monitor); + } if (priv->introspection_daemon != NULL) g_dbus_node_info_unref (priv->introspection_daemon); #if GLIB_CHECK_VERSION(2,63,3) diff --git a/src/fu-remote-list.c b/src/fu-remote-list.c index 4fbb15d5e..1646bde3a 100644 --- a/src/fu-remote-list.c +++ b/src/fu-remote-list.c @@ -475,11 +475,18 @@ fu_remote_list_class_init (FuRemoteListClass *klass) G_TYPE_NONE, 0); } +static void +fu_remote_list_monitor_unref (GFileMonitor *monitor) +{ + g_file_monitor_cancel (monitor); + g_object_unref (monitor); +} + static void fu_remote_list_init (FuRemoteList *self) { self->array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); - self->monitors = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + self->monitors = g_ptr_array_new_with_free_func ((GDestroyNotify) fu_remote_list_monitor_unref); } static void