summaryrefslogtreecommitdiff
path: root/main/dns_query_set.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2015-06-05 12:16:22 -0500
committerRichard Mudgett <rmudgett@digium.com>2015-06-10 18:06:15 -0500
commitb23f33e7e5bc1524d3e2b3536174590db575055e (patch)
tree1918dd3f90b48c944a7f0b837c8f604e7569823b /main/dns_query_set.c
parentae589da4662e0a626223cbef05dc53d197a0b16a (diff)
DNS: Fix some corner cases.
* Fix query_set destruction before we are done kicking the queries off. * Fixed no queries requested handling. * Add empty queries request unit test. * Added missing allocation check in ast_dns_query_set_add(). * Made initial pjsip resolving query vector slightly larger. ASTERISK-25115 Reported by: John Bigelow Change-Id: Ie8be8347d0992e93946d72b6e7b1299727b038f2
Diffstat (limited to 'main/dns_query_set.c')
-rw-r--r--main/dns_query_set.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/main/dns_query_set.c b/main/dns_query_set.c
index 147c737f6..40a89e168 100644
--- a/main/dns_query_set.c
+++ b/main/dns_query_set.c
@@ -130,7 +130,10 @@ int ast_dns_query_set_add(struct ast_dns_query_set *query_set, const char *name,
return -1;
}
- AST_VECTOR_APPEND(&query_set->queries, query);
+ if (AST_VECTOR_APPEND(&query_set->queries, query)) {
+ ao2_ref(query.query, -1);
+ return -1;
+ }
return 0;
}
@@ -175,6 +178,11 @@ void ast_dns_query_set_resolve_async(struct ast_dns_query_set *query_set, ast_dn
query_set->callback = callback;
query_set->user_data = ao2_bump(data);
+ /*
+ * Bump the query_set ref in case all queries complete
+ * before we are done kicking them off.
+ */
+ ao2_ref(query_set, +1);
for (idx = 0; idx < AST_VECTOR_SIZE(&query_set->queries); ++idx) {
struct dns_query_set_query *query = AST_VECTOR_GET_ADDR(&query_set->queries, idx);
@@ -187,6 +195,17 @@ void ast_dns_query_set_resolve_async(struct ast_dns_query_set *query_set, ast_dn
dns_query_set_callback(query->query);
}
+ if (!idx) {
+ /*
+ * There were no queries in the set;
+ * therefore all queries are "completed".
+ * Invoke the final callback.
+ */
+ query_set->callback(query_set);
+ ao2_cleanup(query_set->user_data);
+ query_set->user_data = NULL;
+ }
+ ao2_ref(query_set, -1);
}
/*! \brief Structure used for signaling back for synchronous resolution completion */