diff options
author | Jukka Rissanen <jukka.rissanen@linux.intel.com> | 2012-10-15 13:36:03 +0300 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2012-10-16 12:19:16 +0300 |
commit | 8b9ed30d94dcfd52a7de68aa39937505599ce722 (patch) | |
tree | 6d8d905b027678a8e9a3db161ea62b115da44c28 /gweb/gresolv.c | |
parent | 0306d64c9033814eae433cab973e68befef52525 (diff) | |
download | connman-8b9ed30d94dcfd52a7de68aa39937505599ce722.tar.gz connman-8b9ed30d94dcfd52a7de68aa39937505599ce722.tar.bz2 connman-8b9ed30d94dcfd52a7de68aa39937505599ce722.zip |
gresolv: Avoid accessing already freed memory
We must remove the lookup from lookup queue and query from query queue
before calling user callback. The callback might unref the GResolv which in
turn would remove the lookup/query what we are trying to access after
the callback is returned.
So it is enough to remove the lookup or query entry from queue before
cb is called and then manually remove it after the callback has returned.
Diffstat (limited to 'gweb/gresolv.c')
-rw-r--r-- | gweb/gresolv.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/gweb/gresolv.c b/gweb/gresolv.c index 77c1afb8..440f43c1 100644 --- a/gweb/gresolv.c +++ b/gweb/gresolv.c @@ -497,10 +497,11 @@ static void sort_and_return_results(struct resolv_lookup *lookup) status = lookup->ipv4_status; } + g_queue_remove(lookup->resolv->lookup_queue, lookup); + lookup->result_func(status, results, lookup->result_data); g_strfreev(results); - g_queue_remove(lookup->resolv->lookup_queue, lookup); destroy_lookup(lookup); } @@ -520,11 +521,12 @@ static gboolean query_timeout(gpointer user_data) lookup->ipv6_query = NULL; } + g_queue_remove(resolv->query_queue, query); + if (lookup->ipv4_query == NULL && lookup->ipv6_query == NULL) sort_and_return_results(lookup); destroy_query(query); - g_queue_remove(resolv->query_queue, query); return FALSE; } @@ -709,11 +711,12 @@ static void parse_response(struct resolv_nameserver *nameserver, } } + g_queue_remove(resolv->query_queue, query); + if (lookup->ipv4_query == NULL && lookup->ipv6_query == NULL) sort_and_return_results(lookup); destroy_query(query); - g_queue_remove(resolv->query_queue, query); } static gboolean received_udp_data(GIOChannel *channel, GIOCondition cond, |