aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2013-04-09 10:23:40 -0500
committerDan Williams <dcbw@redhat.com>2013-04-09 10:23:40 -0500
commitdd34e6b4ea9947c6568186cc7a2ed10fd6e81625 (patch)
treeee4deb9d1d62c5f22f0160e18de0f32cadfc6ff9
parentf05fe7d834983e69c0b37edf01014d30bb99c462 (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.c13
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;