[MM] [PATCH v3] iface-modem: fix crashes due to removed skeleton



expire_signal_quality() / mm_iface_modem_update_access_technologies()
may be called after the DBus object skeleton is removed in
mm_iface_modem_shutdown() and before their associated timeout source is
removed (in *_context_free) due to destruction of the modem object.

This patch fixes the issue by removing context objects before removing
the DBus skeleton in mm_iface_modem_shutdown().
---
 src/mm-iface-modem.c |   25 +++++++++++++++++++++++++
 1 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index 49a18a5..3373b5b 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -3676,6 +3676,31 @@ mm_iface_modem_shutdown (MMIfaceModem *self)
 {
     g_return_if_fail (MM_IS_IFACE_MODEM (self));
 
+    /* Remove SignalQualityCheckContext object to make sure any pending
+     * invocation of periodic_signal_quality_check is cancelled before
+     * SignalQualityUpdateContext is removed (as signal_quality_check_ready may
+     * call update_signal_quality). */
+    if (G_LIKELY (signal_quality_check_context_quark))
+        g_object_set_qdata (G_OBJECT (self),
+                            signal_quality_check_context_quark,
+                            NULL);
+
+    /* Remove SignalQualityUpdateContext object to make sure any pending
+     * invocation of expire_signal_quality is canceled before the DBus skeleton
+     * is removed. */
+    if (G_LIKELY (signal_quality_update_context_quark))
+        g_object_set_qdata (G_OBJECT (self),
+                            signal_quality_update_context_quark,
+                            NULL);
+
+    /* Remove AccessTechnologiesCheckContext object to make sure any pending
+     * invocation of periodic_access_technologies_check is canceled before the
+     * DBus skeleton is removed. */
+    if (G_LIKELY (access_technologies_check_context_quark))
+        g_object_set_qdata (G_OBJECT (self),
+                            access_technologies_check_context_quark,
+                            NULL);
+
     /* Remove SIM object */
     g_object_set (self,
                   MM_IFACE_MODEM_SIM, NULL,
-- 
1.7.7.3



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]