mirror of https://github.com/asterisk/asterisk
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							135 lines
						
					
					
						
							4.1 KiB
						
					
					
				
			
		
		
	
	
							135 lines
						
					
					
						
							4.1 KiB
						
					
					
				| 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
 | |
| 
 |