summaryrefslogtreecommitdiff
path: root/third-party/pjproject/patches
diff options
context:
space:
mode:
Diffstat (limited to 'third-party/pjproject/patches')
-rw-r--r--third-party/pjproject/patches/0006-r5471-svn-backport-Various-fixes-for-DNS-IPv6.patch134
-rw-r--r--third-party/pjproject/patches/0006-r5473-svn-backport-Fix-pending-query.patch28
-rw-r--r--third-party/pjproject/patches/0006-r5475-svn-backport-Remove-DNS-cache-entry.patch70
3 files changed, 232 insertions, 0 deletions
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 000000000..98c33e511
--- /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 <rmudgett@digium.com>
+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 000000000..4d11d57ef
--- /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 <rmudgett@digium.com>
+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 000000000..e378c30d7
--- /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 <rmudgett@digium.com>
+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
+