diff options
author | Dan Williams <dcbw@redhat.com> | 2013-04-09 10:23:40 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2013-04-09 10:23:40 -0500 |
commit | dd34e6b4ea9947c6568186cc7a2ed10fd6e81625 (patch) | |
tree | ee4deb9d1d62c5f22f0160e18de0f32cadfc6ff9 | |
parent | f05fe7d834983e69c0b37edf01014d30bb99c462 (diff) |
core: fix mixup of signal handler disconnect vs. GSource removal
Could cause memory corruption, though it was usually only noticed
when MM was quitting.
-rw-r--r-- | src/mm-plugin-base.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/mm-plugin-base.c b/src/mm-plugin-base.c index 2fe8989a..636acf64 100644 --- a/src/mm-plugin-base.c +++ b/src/mm-plugin-base.c @@ -392,12 +392,13 @@ supports_task_dispose (GObject *object) if (priv->open_id) g_source_remove (priv->open_id); - if (priv->full_id) - g_source_remove (priv->full_id); if (priv->probe_id) g_source_remove (priv->probe_id); if (priv->probe_port) { + if (priv->full_id) + g_signal_handler_disconnect (priv->probe_port, priv->full_id); + mm_serial_port_close (MM_SERIAL_PORT (priv->probe_port)); g_object_unref (priv->probe_port); } @@ -602,6 +603,10 @@ emit_probe_result (gpointer user_data) /* Close the serial ports */ if (task_priv->probe_port) { + if (task_priv->full_id) { + g_signal_handler_disconnect (task_priv->probe_port, task_priv->full_id); + task_priv->full_id = 0; + } g_object_unref (task_priv->probe_port); task_priv->probe_port = NULL; } @@ -695,6 +700,10 @@ try_qcdm_probe (MMPluginBaseSupportsTask *task) /* Close the AT port */ if (priv->probe_port) { + if (priv->full_id) { + g_signal_handler_disconnect (priv->probe_port, priv->full_id); + priv->full_id = 0; + } mm_serial_port_close (MM_SERIAL_PORT (priv->probe_port)); g_object_unref (priv->probe_port); priv->probe_port = NULL; |