[PATCH] broadband-modem-mbim: explicitly remove notification handler on unref

Aleksander Morgado aleksander at aleksander.es
Fri Aug 11 15:04:26 UTC 2017


When we remove the last object reference, make sure the notification
handler is also removed, or we may end up using an already freed
object.

https://retrace.fedoraproject.org/faf/reports/1815001/
---
 src/mm-broadband-modem-mbim.c | 61 +++++++++++++++++++++++++++----------------
 1 file changed, 38 insertions(+), 23 deletions(-)

diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 815f5455..8a722b11 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -2215,24 +2215,12 @@ device_notification_cb (MbimDevice *device,
     }
 }
 
-static gboolean
-common_setup_cleanup_unsolicited_events_finish (MMBroadbandModemMbim *self,
-                                                GAsyncResult *res,
-                                                GError **error)
-{
-    return g_task_propagate_boolean (G_TASK (res), error);
-}
-
 static void
-common_setup_cleanup_unsolicited_events (MMBroadbandModemMbim *self,
-                                         gboolean setup,
-                                         GAsyncReadyCallback callback,
-                                         gpointer user_data)
+common_setup_cleanup_unsolicited_events_sync (MMBroadbandModemMbim *self,
+                                              MbimDevice           *device,
+                                              gboolean              setup)
 {
-    MbimDevice *device;
-    GTask *task;
-
-    if (!peek_device (self, &device, callback, user_data))
+    if (!device)
         return;
 
     mm_dbg ("Supported notifications: signal (%s), registration (%s), sms (%s), connect (%s), subscriber (%s), packet (%s)",
@@ -2260,6 +2248,29 @@ common_setup_cleanup_unsolicited_events (MMBroadbandModemMbim *self,
             self->priv->notification_id = 0;
         }
     }
+}
+
+static gboolean
+common_setup_cleanup_unsolicited_events_finish (MMBroadbandModemMbim  *self,
+                                                GAsyncResult          *res,
+                                                GError               **error)
+{
+    return g_task_propagate_boolean (G_TASK (res), error);
+}
+
+static void
+common_setup_cleanup_unsolicited_events (MMBroadbandModemMbim *self,
+                                         gboolean              setup,
+                                         GAsyncReadyCallback   callback,
+                                         gpointer              user_data)
+{
+    GTask      *task;
+    MbimDevice *device;
+
+    if (!peek_device (self, &device, callback, user_data))
+        return;
+
+    common_setup_cleanup_unsolicited_events_sync (self, device, setup);
 
     task = g_task_new (self, NULL, callback, user_data);
     g_task_return_boolean (task, TRUE);
@@ -3174,20 +3185,24 @@ mm_broadband_modem_mbim_init (MMBroadbandModemMbim *self)
 static void
 finalize (GObject *object)
 {
-    MMPortMbim *mbim;
     MMBroadbandModemMbim *self = MM_BROADBAND_MODEM_MBIM (object);
+    MMPortMbim *mbim;
+
+    mbim = mm_base_modem_peek_port_mbim (MM_BASE_MODEM (self));
+    if (mbim) {
+        /* Explicitly remove notification handler */
+        self->priv->setup_flags = PROCESS_NOTIFICATION_FLAG_NONE;
+        common_setup_cleanup_unsolicited_events_sync (self, mm_port_mbim_peek_device (mbim), FALSE);
+        /* If we did open the MBIM port during initialization, close it now */
+        if (mm_port_mbim_is_open (mbim))
+            mm_port_mbim_close (mbim, NULL, NULL);
+    }
 
     g_free (self->priv->caps_device_id);
     g_free (self->priv->caps_firmware_info);
     g_free (self->priv->current_operator_id);
     g_free (self->priv->current_operator_name);
 
-    mbim = mm_base_modem_peek_port_mbim (MM_BASE_MODEM (self));
-    /* If we did open the MBIM port during initialization, close it now */
-    if (mbim && mm_port_mbim_is_open (mbim)) {
-        mm_port_mbim_close (mbim, NULL, NULL);
-    }
-
     G_OBJECT_CLASS (mm_broadband_modem_mbim_parent_class)->finalize (object);
 }
 
-- 
2.13.1



More information about the ModemManager-devel mailing list