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
This commit is contained in:
Richard Mudgett
2015-06-05 12:16:22 -05:00
parent ae589da466
commit b23f33e7e5
3 changed files with 49 additions and 2 deletions

View File

@@ -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 */