summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMingli Wu <mingli@southpole.se>2012-12-04 16:33:47 +0100
committerDenis Kenzior <denkenz@gmail.com>2012-12-04 23:48:14 -0600
commit911eeb6565bf3cdf04322f3a2c040431b19808bb (patch)
tree6f231416d95dcbee971af2125f69594ecae19c8f
parent25e7ecd3c783d03e833938c617e4507bf6e9394a (diff)
downloadofono-911eeb6565bf3cdf04322f3a2c040431b19808bb.tar.bz2
atmodem: remove pending idle callbacks at removal
If device probe and removal happen in short succession, it's possible that the idle handler registered in the probe function doesn't run before the device is removed. In this case, the idle handler needs to be unregistered so that it does not run and try to access the data that's destroyed during the removal.
-rw-r--r--drivers/atmodem/call-barring.c1
-rw-r--r--drivers/atmodem/call-forwarding.c1
-rw-r--r--drivers/atmodem/call-settings.c1
-rw-r--r--drivers/atmodem/sim-auth.c1
-rw-r--r--drivers/atmodem/sim.c1
-rw-r--r--drivers/atmodem/stk.c1
6 files changed, 6 insertions, 0 deletions
diff --git a/drivers/atmodem/call-barring.c b/drivers/atmodem/call-barring.c
index a2417c7d..1239d053 100644
--- a/drivers/atmodem/call-barring.c
+++ b/drivers/atmodem/call-barring.c
@@ -207,6 +207,7 @@ static void at_call_barring_remove(struct ofono_call_barring *cb)
{
GAtChat *chat = ofono_call_barring_get_data(cb);
+ g_idle_remove_by_data(cb);
g_at_chat_unref(chat);
ofono_call_barring_set_data(cb, NULL);
}
diff --git a/drivers/atmodem/call-forwarding.c b/drivers/atmodem/call-forwarding.c
index cbe4b24e..e2020d36 100644
--- a/drivers/atmodem/call-forwarding.c
+++ b/drivers/atmodem/call-forwarding.c
@@ -259,6 +259,7 @@ static void at_ccfc_remove(struct ofono_call_forwarding *cf)
{
GAtChat *chat = ofono_call_forwarding_get_data(cf);
+ g_idle_remove_by_data(cf);
g_at_chat_unref(chat);
ofono_call_forwarding_set_data(cf, NULL);
}
diff --git a/drivers/atmodem/call-settings.c b/drivers/atmodem/call-settings.c
index 2dc16e4b..f017ab5c 100644
--- a/drivers/atmodem/call-settings.c
+++ b/drivers/atmodem/call-settings.c
@@ -393,6 +393,7 @@ static void at_call_settings_remove(struct ofono_call_settings *cs)
{
GAtChat *chat = ofono_call_settings_get_data(cs);
+ g_idle_remove_by_data(cs);
g_at_chat_unref(chat);
ofono_call_settings_set_data(cs, NULL);
}
diff --git a/drivers/atmodem/sim-auth.c b/drivers/atmodem/sim-auth.c
index 9ce810f6..271ceed2 100644
--- a/drivers/atmodem/sim-auth.c
+++ b/drivers/atmodem/sim-auth.c
@@ -139,6 +139,7 @@ static void at_sim_auth_remove(struct ofono_sim_auth *sa)
{
struct sim_auth_data *sad = ofono_sim_auth_get_data(sa);
+ g_idle_remove_by_data(sa);
ofono_sim_auth_set_data(sa, NULL);
g_at_chat_unref(sad->chat);
diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c
index effc5955..40953373 100644
--- a/drivers/atmodem/sim.c
+++ b/drivers/atmodem/sim.c
@@ -1493,6 +1493,7 @@ static void at_sim_remove(struct ofono_sim *sim)
{
struct sim_data *sd = ofono_sim_get_data(sim);
+ g_idle_remove_by_data(sim);
/* Cleanup potential SIM state polling */
at_util_sim_state_query_free(sd->sim_state_query);
diff --git a/drivers/atmodem/stk.c b/drivers/atmodem/stk.c
index f0bd3a0b..b4fb2f24 100644
--- a/drivers/atmodem/stk.c
+++ b/drivers/atmodem/stk.c
@@ -216,6 +216,7 @@ static void at_stk_remove(struct ofono_stk *stk)
{
struct stk_data *sd = ofono_stk_get_data(stk);
+ g_idle_remove_by_data(stk);
ofono_stk_set_data(stk, NULL);
g_at_chat_unref(sd->chat);