* Re #1945 (misc): Don't trigger SRV complete callback when there is a parse error. * srv_resolver.c: Don't try to send query if already considered resolved. ** In resolve_hostnames() don't try to resolve a query that is already considered resolved. ** In resolve_hostnames() fix DNS typo in comments. ** In build_server_entries() move a common expression assigning to cnt earlier. * sip_transport.c: Fix tdata object name to actually contain the pointer. It helps if the logs referencing a tdata object buffer actually have a name that includes the correct pointer as part of the name. Also since the tdata has its own pool it helps if any logs referencing the pool have the same name as the tdata object. This change brings tdata logging in line with how tsx objects are named. ASTERISK-26669 #close ASTERISK-26738 #close Change-Id: I56af2ded25476b3e870ca586ee69ed6954ef75af
113 lines
4.4 KiB
Diff
113 lines
4.4 KiB
Diff
From d9d52f005f6d0242ea84e7c59ad6b25f052c8485 Mon Sep 17 00:00:00 2001
|
|
From: Richard Mudgett <rmudgett@digium.com>
|
|
Date: Mon, 20 Feb 2017 12:05:32 -0600
|
|
Subject: [PATCH 3/5] r5559 svn backport Fix to resolve DNS SRV crashes.
|
|
|
|
Re #1994 (misc): Don't try to resolve a DNS SRV query that is already considered resolved.
|
|
Thanks to Richard Mudgett for the patch.
|
|
|
|
srv_resolver.c: Don't try to send query if already considered resolved.
|
|
|
|
* In resolve_hostnames() don't try to resolve a query that is already
|
|
considered resolved.
|
|
|
|
* In resolve_hostnames() fix DNS typo in comments.
|
|
|
|
* In build_server_entries() move a common expression assigning to cnt
|
|
earlier.
|
|
|
|
sip_transport.c: Fix tdata object name to actually contain the pointer.
|
|
|
|
It helps if the logs referencing a tdata object buffer actually have
|
|
a name that includes the correct pointer as part of the name. Also
|
|
since the tdata has its own pool it helps if any logs referencing the
|
|
pool have the same name as the tdata object. This change brings tdata
|
|
logging in line with how tsx objects are named.
|
|
---
|
|
pjlib-util/src/pjlib-util/srv_resolver.c | 18 +++++++++++++-----
|
|
pjsip/src/pjsip/sip_transport.c | 3 ++-
|
|
2 files changed, 15 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/pjlib-util/src/pjlib-util/srv_resolver.c b/pjlib-util/src/pjlib-util/srv_resolver.c
|
|
index 8a2f7e1..84ad3f6 100644
|
|
--- a/pjlib-util/src/pjlib-util/srv_resolver.c
|
|
+++ b/pjlib-util/src/pjlib-util/srv_resolver.c
|
|
@@ -407,8 +407,9 @@ static void build_server_entries(pj_dns_srv_async_query *query_job,
|
|
for (i=0; i<query_job->srv_cnt; ++i) {
|
|
pj_in_addr addr;
|
|
pj_in6_addr addr6;
|
|
+ unsigned cnt = query_job->srv[i].addr_cnt;
|
|
|
|
- if (query_job->srv[i].addr_cnt != 0) {
|
|
+ if (cnt != 0) {
|
|
/* IP address already resolved */
|
|
continue;
|
|
}
|
|
@@ -417,7 +418,6 @@ static void build_server_entries(pj_dns_srv_async_query *query_job,
|
|
pj_inet_pton(pj_AF_INET(), &query_job->srv[i].target_name,
|
|
&addr) == PJ_SUCCESS)
|
|
{
|
|
- unsigned cnt = query_job->srv[i].addr_cnt;
|
|
pj_sockaddr_init(pj_AF_INET(), &query_job->srv[i].addr[cnt],
|
|
NULL, query_job->srv[i].port);
|
|
query_job->srv[i].addr[cnt].ipv4.sin_addr = addr;
|
|
@@ -427,7 +427,6 @@ static void build_server_entries(pj_dns_srv_async_query *query_job,
|
|
pj_inet_pton(pj_AF_INET6(), &query_job->srv[i].target_name,
|
|
&addr6) == PJ_SUCCESS)
|
|
{
|
|
- unsigned cnt = query_job->srv[i].addr_cnt;
|
|
pj_sockaddr_init(pj_AF_INET6(), &query_job->srv[i].addr[cnt],
|
|
NULL, query_job->srv[i].port);
|
|
query_job->srv[i].addr[cnt].ipv6.sin6_addr = addr6;
|
|
@@ -480,6 +479,15 @@ static pj_status_t resolve_hostnames(pj_dns_srv_async_query *query_job)
|
|
for (i=0; i<query_job->srv_cnt; ++i) {
|
|
struct srv_target *srv = &query_job->srv[i];
|
|
|
|
+ if (srv->addr_cnt != 0) {
|
|
+ /*
|
|
+ * This query is already counted as resolved because of the
|
|
+ * additional records in the SRV response or the target name
|
|
+ * is an IP address exception in build_server_entries().
|
|
+ */
|
|
+ continue;
|
|
+ }
|
|
+
|
|
PJ_LOG(5, (query_job->objname,
|
|
"Starting async DNS A query_job for %.*s",
|
|
(int)srv->target_name.slen,
|
|
@@ -493,7 +501,7 @@ static pj_status_t resolve_hostnames(pj_dns_srv_async_query *query_job)
|
|
|
|
status = PJ_SUCCESS;
|
|
|
|
- /* Start DNA A record query */
|
|
+ /* Start DNS A record query */
|
|
if ((query_job->option & PJ_DNS_SRV_RESOLVE_AAAA_ONLY) == 0)
|
|
{
|
|
if ((query_job->option & PJ_DNS_SRV_RESOLVE_AAAA) != 0) {
|
|
@@ -511,7 +519,7 @@ static pj_status_t resolve_hostnames(pj_dns_srv_async_query *query_job)
|
|
&srv->common, &srv->q_a);
|
|
}
|
|
|
|
- /* Start DNA AAAA record query */
|
|
+ /* Start DNS AAAA record query */
|
|
if (status == PJ_SUCCESS &&
|
|
(query_job->option & PJ_DNS_SRV_RESOLVE_AAAA) != 0)
|
|
{
|
|
diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c
|
|
index d672a6d..6dd14d1 100644
|
|
--- a/pjsip/src/pjsip/sip_transport.c
|
|
+++ b/pjsip/src/pjsip/sip_transport.c
|
|
@@ -422,7 +422,8 @@ PJ_DEF(pj_status_t) pjsip_tx_data_create( pjsip_tpmgr *mgr,
|
|
tdata = PJ_POOL_ZALLOC_T(pool, pjsip_tx_data);
|
|
tdata->pool = pool;
|
|
tdata->mgr = mgr;
|
|
- pj_memcpy(tdata->obj_name, pool->obj_name, PJ_MAX_OBJ_NAME);
|
|
+ pj_ansi_snprintf(tdata->obj_name, sizeof(tdata->obj_name), "tdta%p", tdata);
|
|
+ pj_memcpy(pool->obj_name, tdata->obj_name, sizeof(pool->obj_name));
|
|
|
|
status = pj_atomic_create(tdata->pool, 0, &tdata->ref_cnt);
|
|
if (status != PJ_SUCCESS) {
|
|
--
|
|
2.7.4
|
|
|