diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2022-05-09 22:44:56 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2022-05-11 12:13:34 +0000 |
commit | e163ab504a32fc68ed95b9b818ce648e1b3b50ab (patch) | |
tree | d722d5950585ac1078e0e12d37f7dec1cf4cbfff /src | |
parent | acd5f466d7f3a8749405cd767ed16fae3e7a1638 (diff) |
broadband-modem-mbim: fix task completion when peeking device fails
We cannot call peek_device() when we have already created a GTask for
the async operation, because if the operation failed we would be
completing the async operation with a totally different GTask than the
one we had created ourselves, triggering memory leaks and leaving
modem references around that should not exist (as the GTask we create
holds a modem reference).
Issue found in the context of debugging this, may actually be fully
related:
https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/550
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index c987c6d5..1ca8789b 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -194,6 +194,25 @@ peek_device (gpointer self, return TRUE; } +static gboolean +peek_device_in_task (gpointer self, + MbimDevice **o_device, + GTask *task) + +{ + MMPortMbim *port; + + port = mm_broadband_modem_mbim_peek_port_mbim (MM_BROADBAND_MODEM_MBIM (self)); + if (!port) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "Couldn't peek MBIM port"); + g_object_unref (task); + return FALSE; + } + + *o_device = mm_port_mbim_peek_device (port); + return TRUE; +} + #if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED static QmiClient * @@ -8603,7 +8622,7 @@ load_sim_slots_mbim (GTask *task) self = g_task_get_source_object (task); - if (!peek_device (self, &device, NULL, NULL)) + if (!peek_device_in_task (self, &device, task)) return; message = mbim_message_ms_basic_connect_extensions_sys_caps_query_new (NULL); @@ -8792,7 +8811,7 @@ set_primary_sim_slot_mbim (GTask *task) self = g_task_get_source_object (task); - if (!peek_device (self, &device, NULL, NULL)) + if (!peek_device_in_task (self, &device, task)) return; message = mbim_message_ms_basic_connect_extensions_device_slot_mappings_query_new (NULL); |