diff --git a/third-party/pjproject/patches/0006-r5471-svn-backport-Various-fixes-for-DNS-IPv6.patch b/third-party/pjproject/patches/0006-r5471-svn-backport-Various-fixes-for-DNS-IPv6.patch new file mode 100644 index 0000000000..98c33e5110 --- /dev/null +++ b/third-party/pjproject/patches/0006-r5471-svn-backport-Various-fixes-for-DNS-IPv6.patch @@ -0,0 +1,134 @@ +From 2ab7a9f67caf73be3f2215473f72882cfaef4972 Mon Sep 17 00:00:00 2001 +From: Richard Mudgett +Date: Fri, 28 Oct 2016 12:11:30 -0500 +Subject: [PATCH 1/3] r5471 svn backport Various fixes for DNS IPv6 + +Fixed #1974: Various fixes for DNS IPv6 +--- + pjlib-util/src/pjlib-util/resolver.c | 11 +++++------ + pjlib-util/src/pjlib-util/srv_resolver.c | 17 +++++++++++++++-- + pjsip/src/pjsip/sip_resolve.c | 14 +++++++------- + 3 files changed, 27 insertions(+), 15 deletions(-) + +diff --git a/pjlib-util/src/pjlib-util/resolver.c b/pjlib-util/src/pjlib-util/resolver.c +index e5e1bed..d24ef9d 100644 +--- a/pjlib-util/src/pjlib-util/resolver.c ++++ b/pjlib-util/src/pjlib-util/resolver.c +@@ -835,7 +835,7 @@ PJ_DEF(pj_status_t) pj_dns_resolver_start_query( pj_dns_resolver *resolver, + pj_time_val now; + struct res_key key; + struct cached_res *cache; +- pj_dns_async_query *q; ++ pj_dns_async_query *q, *p_q = NULL; + pj_uint32_t hval; + pj_status_t status = PJ_SUCCESS; + +@@ -849,9 +849,6 @@ PJ_DEF(pj_status_t) pj_dns_resolver_start_query( pj_dns_resolver *resolver, + /* Check type */ + PJ_ASSERT_RETURN(type > 0 && type < 0xFFFF, PJ_EINVAL); + +- if (p_query) +- *p_query = NULL; +- + /* Build resource key for looking up hash tables */ + init_res_key(&key, type, name); + +@@ -970,10 +967,12 @@ PJ_DEF(pj_status_t) pj_dns_resolver_start_query( pj_dns_resolver *resolver, + pj_hash_set_np(resolver->hquerybyres, &q->key, sizeof(q->key), + 0, q->hbufkey, q); + +- if (p_query) +- *p_query = q; ++ p_q = q; + + on_return: ++ if (p_query) ++ *p_query = p_q; ++ + pj_mutex_unlock(resolver->mutex); + return status; + } +diff --git a/pjlib-util/src/pjlib-util/srv_resolver.c b/pjlib-util/src/pjlib-util/srv_resolver.c +index 02672aa..ff9c979 100644 +--- a/pjlib-util/src/pjlib-util/srv_resolver.c ++++ b/pjlib-util/src/pjlib-util/srv_resolver.c +@@ -187,9 +187,12 @@ PJ_DEF(pj_status_t) pj_dns_srv_cancel_query(pj_dns_srv_async_query *query, + has_pending = PJ_TRUE; + } + if (srv->q_aaaa) { +- pj_dns_resolver_cancel_query(srv->q_aaaa, PJ_FALSE); ++ /* Check if it is a dummy query. */ ++ if (srv->q_aaaa != (pj_dns_async_query*)0x1) { ++ pj_dns_resolver_cancel_query(srv->q_aaaa, PJ_FALSE); ++ has_pending = PJ_TRUE; ++ } + srv->q_aaaa = NULL; +- has_pending = PJ_TRUE; + } + } + +@@ -485,12 +488,22 @@ static pj_status_t resolve_hostnames(pj_dns_srv_async_query *query_job) + srv->common.type = PJ_DNS_TYPE_A; + srv->common_aaaa.type = PJ_DNS_TYPE_AAAA; + srv->parent = query_job; ++ srv->q_a = NULL; ++ srv->q_aaaa = NULL; + + status = PJ_SUCCESS; + + /* Start DNA A record query */ + if ((query_job->option & PJ_DNS_SRV_RESOLVE_AAAA_ONLY) == 0) + { ++ if ((query_job->option & PJ_DNS_SRV_RESOLVE_AAAA) != 0) { ++ /* If there will be DNS AAAA query too, let's setup ++ * a dummy one here, otherwise app callback may be called ++ * immediately (before DNS AAAA query is sent) when ++ * DNS A record is available in the cache. ++ */ ++ srv->q_aaaa = (pj_dns_async_query*)0x1; ++ } + status = pj_dns_resolver_start_query(query_job->resolver, + &srv->target_name, + PJ_DNS_TYPE_A, 0, +diff --git a/pjsip/src/pjsip/sip_resolve.c b/pjsip/src/pjsip/sip_resolve.c +index ed326ba..3f3654d 100644 +--- a/pjsip/src/pjsip/sip_resolve.c ++++ b/pjsip/src/pjsip/sip_resolve.c +@@ -452,7 +452,7 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver, + } + + /* Resolve DNS AAAA record if address family is not fixed to IPv4 */ +- if (af != pj_AF_INET()) { ++ if (af != pj_AF_INET() && status == PJ_SUCCESS) { + status = pj_dns_resolver_start_query(resolver->res, + &query->naptr[0].name, + PJ_DNS_TYPE_AAAA, 0, +@@ -530,9 +530,9 @@ static void dns_a_callback(void *user_data, + + ++srv->count; + } +- +- } else { +- ++ } ++ ++ if (status != PJ_SUCCESS) { + char errmsg[PJ_ERR_MSG_SIZE]; + + /* Log error */ +@@ -593,9 +593,9 @@ static void dns_aaaa_callback(void *user_data, + + ++srv->count; + } +- +- } else { +- ++ } ++ ++ if (status != PJ_SUCCESS) { + char errmsg[PJ_ERR_MSG_SIZE]; + + /* Log error */ +-- +1.7.9.5 + diff --git a/third-party/pjproject/patches/0006-r5473-svn-backport-Fix-pending-query.patch b/third-party/pjproject/patches/0006-r5473-svn-backport-Fix-pending-query.patch new file mode 100644 index 0000000000..4d11d57efa --- /dev/null +++ b/third-party/pjproject/patches/0006-r5473-svn-backport-Fix-pending-query.patch @@ -0,0 +1,28 @@ +From 509d4339747f11cfbde3a0acc447ef5d521eea93 Mon Sep 17 00:00:00 2001 +From: Richard Mudgett +Date: Fri, 28 Oct 2016 12:12:28 -0500 +Subject: [PATCH 2/3] r5473 svn backport Fix pending query + +Re #1974: +If there is a pending query, set the return value to that query (instead of NULL) + +Thanks to Richard Mudgett for the patch. +--- + pjlib-util/src/pjlib-util/resolver.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/pjlib-util/src/pjlib-util/resolver.c b/pjlib-util/src/pjlib-util/resolver.c +index d24ef9d..fe687b7 100644 +--- a/pjlib-util/src/pjlib-util/resolver.c ++++ b/pjlib-util/src/pjlib-util/resolver.c +@@ -940,6 +940,7 @@ PJ_DEF(pj_status_t) pj_dns_resolver_start_query( pj_dns_resolver *resolver, + /* Done. This child query will be notified once the "parent" + * query completes. + */ ++ p_q = nq; + status = PJ_SUCCESS; + goto on_return; + } +-- +1.7.9.5 + diff --git a/third-party/pjproject/patches/0006-r5475-svn-backport-Remove-DNS-cache-entry.patch b/third-party/pjproject/patches/0006-r5475-svn-backport-Remove-DNS-cache-entry.patch new file mode 100644 index 0000000000..e378c30d75 --- /dev/null +++ b/third-party/pjproject/patches/0006-r5475-svn-backport-Remove-DNS-cache-entry.patch @@ -0,0 +1,70 @@ +From 46e1cfa18853a38b7fcdebad782710c5db676657 Mon Sep 17 00:00:00 2001 +From: Richard Mudgett +Date: Fri, 28 Oct 2016 12:15:44 -0500 +Subject: [PATCH 3/3] r5475 svn backport Remove DNS cache entry + +Re #1974: Remove DNS cache entry from resolver's hash table when app callback has a reference. + +Thanks to Richard Mudgett for the patch. +--- + pjlib-util/src/pjlib-util/resolver.c | 29 +++++++++++++++-------------- + 1 file changed, 15 insertions(+), 14 deletions(-) + +diff --git a/pjlib-util/src/pjlib-util/resolver.c b/pjlib-util/src/pjlib-util/resolver.c +index fe687b7..52b7655 100644 +--- a/pjlib-util/src/pjlib-util/resolver.c ++++ b/pjlib-util/src/pjlib-util/resolver.c +@@ -1444,10 +1444,12 @@ static void update_res_cache(pj_dns_resolver *resolver, + if (ttl > resolver->settings.cache_max_ttl) + ttl = resolver->settings.cache_max_ttl; + ++ /* Get a cache response entry */ ++ cache = (struct cached_res *) pj_hash_get(resolver->hrescache, key, ++ sizeof(*key), &hval); ++ + /* If TTL is zero, clear the same entry in the hash table */ + if (ttl == 0) { +- cache = (struct cached_res *) pj_hash_get(resolver->hrescache, key, +- sizeof(*key), &hval); + /* Remove the entry before releasing its pool (see ticket #1710) */ + pj_hash_set(NULL, resolver->hrescache, key, sizeof(*key), hval, NULL); + +@@ -1457,24 +1459,23 @@ static void update_res_cache(pj_dns_resolver *resolver, + return; + } + +- /* Get a cache response entry */ +- cache = (struct cached_res *) pj_hash_get(resolver->hrescache, key, +- sizeof(*key), &hval); + if (cache == NULL) { + cache = alloc_entry(resolver); +- } else if (cache->ref_cnt > 1) { +- /* When cache entry is being used by callback (to app), just decrement +- * ref_cnt so it will be freed after the callback returns and allocate +- * new entry. +- */ +- cache->ref_cnt--; +- cache = alloc_entry(resolver); + } else { + /* Remove the entry before resetting its pool (see ticket #1710) */ + pj_hash_set(NULL, resolver->hrescache, key, sizeof(*key), hval, NULL); + +- /* Reset cache to avoid bloated cache pool */ +- reset_entry(&cache); ++ if (cache->ref_cnt > 1) { ++ /* When cache entry is being used by callback (to app), ++ * just decrement ref_cnt so it will be freed after ++ * the callback returns and allocate new entry. ++ */ ++ cache->ref_cnt--; ++ cache = alloc_entry(resolver); ++ } else { ++ /* Reset cache to avoid bloated cache pool */ ++ reset_entry(&cache); ++ } + } + + /* Duplicate the packet. +-- +1.7.9.5 +