From c1ed32db9d456e0756441c1d820cd619d8f344e9 Mon Sep 17 00:00:00 2001 From: Mikel Astiz Date: Fri, 21 Oct 2011 18:51:32 +0200 Subject: [PATCH] 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. --- drivers/hfpmodem/network-registration.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/hfpmodem/network-registration.c b/drivers/hfpmodem/network-registration.c index da7d8eb..4b9f875 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); -- 2.7.4