diff options
author | Mikel Astiz <mikel.astiz@bmw-carit.de> | 2011-10-21 18:51:32 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2011-10-21 13:17:13 -0500 |
commit | c1ed32db9d456e0756441c1d820cd619d8f344e9 (patch) | |
tree | 815d5364893d9269d3d45a5ebb0e4307473f60a8 | |
parent | 8779b46258844523996b2a2b752478a41bd985bc (diff) | |
download | ofono-c1ed32db9d456e0756441c1d820cd619d8f344e9.tar.bz2 |
hfpmodem: Avoid segfault in network-registration
The use of g_idle_add can cause a segmentation fault if the object is
destroyed in the meantime.
-rw-r--r-- | drivers/hfpmodem/network-registration.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/hfpmodem/network-registration.c b/drivers/hfpmodem/network-registration.c index da7d8eb1..4b9f875b 100644 --- a/drivers/hfpmodem/network-registration.c +++ b/drivers/hfpmodem/network-registration.c @@ -51,6 +51,7 @@ struct netreg_data { GAtChat *chat; unsigned char cind_pos[HFP_INDICATOR_LAST]; int cind_val[HFP_INDICATOR_LAST]; + guint register_source; }; static void cops_cb(gboolean ok, GAtResult *result, gpointer user_data) @@ -297,6 +298,9 @@ static void hfp_signal_strength(struct ofono_netreg *netreg, static gboolean hfp_netreg_register(gpointer user_data) { struct ofono_netreg *netreg = user_data; + struct netreg_data *nd = ofono_netreg_get_data(netreg); + + nd->register_source = 0; ofono_netreg_register(netreg); @@ -320,7 +324,7 @@ static int hfp_netreg_probe(struct ofono_netreg *netreg, unsigned int vendor, g_at_chat_register(nd->chat, "+CIEV:", ciev_notify, FALSE, netreg, NULL); - g_idle_add(hfp_netreg_register, netreg); + nd->register_source = g_idle_add(hfp_netreg_register, netreg); return 0; } @@ -329,6 +333,9 @@ static void hfp_netreg_remove(struct ofono_netreg *netreg) { struct netreg_data *nd = ofono_netreg_get_data(netreg); + if (nd->register_source != 0) + g_source_remove(nd->register_source); + ofono_netreg_set_data(netreg, NULL); g_at_chat_unref(nd->chat); |