[Asterisk-code-review] DNS: Fix some corner cases. (asterisk[master])
Richard Mudgett
asteriskteam at digium.com
Wed Jun 10 13:08:55 CDT 2015
Richard Mudgett has uploaded a new change for review.
https://gerrit.asterisk.org/626
Change subject: DNS: Fix some corner cases.
......................................................................
DNS: Fix some corner cases.
* Fix query_set destruction before we are done kicking the queries off.
* Fixed no queries requested handling.
* 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
---
M main/dns_query_set.c
M res/res_pjsip/pjsip_resolver.c
2 files changed, 27 insertions(+), 2 deletions(-)
git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/26/626/1
diff --git a/main/dns_query_set.c b/main/dns_query_set.c
index 147c737..40a89e1 100644
--- a/main/dns_query_set.c
+++ b/main/dns_query_set.c
@@ -130,7 +130,10 @@
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 @@
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 @@
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 */
diff --git a/res/res_pjsip/pjsip_resolver.c b/res/res_pjsip/pjsip_resolver.c
index 4573e4c..915d1d9 100644
--- a/res/res_pjsip/pjsip_resolver.c
+++ b/res/res_pjsip/pjsip_resolver.c
@@ -516,7 +516,7 @@
resolve->callback = cb;
resolve->token = token;
- if (AST_VECTOR_INIT(&resolve->resolving, 2)) {
+ if (AST_VECTOR_INIT(&resolve->resolving, 4)) {
ao2_ref(resolve, -1);
cb(PJ_ENOMEM, token, NULL);
return;
@@ -565,6 +565,12 @@
cb(PJ_ENOMEM, token, NULL);
return;
}
+ if (!resolve->queries) {
+ ast_debug(2, "[%p] No resolution queries for target '%s'\n", resolve, host);
+ ao2_ref(resolve, -1);
+ cb(PJLIB_UTIL_EDNSNOANSWERREC, token, NULL);
+ return;
+ }
ast_debug(2, "[%p] Starting initial resolution using parallel queries for target '%s'\n", resolve, host);
ast_dns_query_set_resolve_async(resolve->queries, sip_resolve_callback, resolve);
--
To view, visit https://gerrit.asterisk.org/626
To unsubscribe, visit https://gerrit.asterisk.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie8be8347d0992e93946d72b6e7b1299727b038f2
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Richard Mudgett <rmudgett at digium.com>
More information about the asterisk-code-review
mailing list