diff options
author | Richard Mudgett <rmudgett@digium.com> | 2015-06-05 12:16:22 -0500 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2015-06-10 18:06:15 -0500 |
commit | b23f33e7e5bc1524d3e2b3536174590db575055e (patch) | |
tree | 1918dd3f90b48c944a7f0b837c8f604e7569823b /main/dns_query_set.c | |
parent | ae589da4662e0a626223cbef05dc53d197a0b16a (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.c | 21 |
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 */ |