diff options
author | Mikel Astiz <mikel.astiz@bmw-carit.de> | 2011-10-21 18:51:34 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2011-10-21 13:17:40 -0500 |
commit | 710043514219bcc940595027a45dea313ea2d00d (patch) | |
tree | eca7f59658342c249e1cebaf89931c28ec58e732 /drivers/hfpmodem | |
parent | 6e5edc8ead8f1639e848cd5074014e7fc124b732 (diff) | |
download | ofono-710043514219bcc940595027a45dea313ea2d00d.tar.bz2 |
hfpmodem: Avoid segfault in handsfree
The use of g_idle_add can cause a segmentation fault if the object is
destroyed in the meantime.
Diffstat (limited to 'drivers/hfpmodem')
-rw-r--r-- | drivers/hfpmodem/handsfree.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/hfpmodem/handsfree.c b/drivers/hfpmodem/handsfree.c index ad656ce2..7ecf0cce 100644 --- a/drivers/hfpmodem/handsfree.c +++ b/drivers/hfpmodem/handsfree.c @@ -48,6 +48,7 @@ static const char *bvra_prefix[] = { "+BVRA:", NULL }; struct hf_data { GAtChat *chat; unsigned int ag_features; + guint register_source; }; static void hf_generic_set_cb(gboolean ok, GAtResult *result, @@ -101,6 +102,8 @@ static gboolean hfp_handsfree_register(gpointer user_data) struct ofono_handsfree *hf = user_data; struct hf_data *hd = ofono_handsfree_get_data(hf); + hd->register_source = 0; + g_at_chat_register(hd->chat, "+BSIR:", bsir_notify, FALSE, hf, NULL); g_at_chat_register(hd->chat, "+BVRA:", bvra_notify, FALSE, hf, NULL); @@ -125,7 +128,7 @@ static int hfp_handsfree_probe(struct ofono_handsfree *hf, ofono_handsfree_set_data(hf, hd); - g_idle_add(hfp_handsfree_register, hf); + hd->register_source = g_idle_add(hfp_handsfree_register, hf); return 0; } @@ -134,6 +137,9 @@ static void hfp_handsfree_remove(struct ofono_handsfree *hf) { struct hf_data *hd = ofono_handsfree_get_data(hf); + if (hd->register_source != 0) + g_source_remove(hd->register_source); + ofono_handsfree_set_data(hf, NULL); g_at_chat_unref(hd->chat); |