From 75c8c6876bd2cfbe6286d3ead5ca7004b8ab7634 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Wed, 17 Aug 2016 04:29:17 +0000 Subject: Fixed #1953: Skip IPv6 socket in resolver on system without IPv6 support. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5420 74dad513-b988-da41-8d7b-12977e46ad98 --- pjlib-util/src/pjlib-util/resolver.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) (limited to 'pjlib-util') diff --git a/pjlib-util/src/pjlib-util/resolver.c b/pjlib-util/src/pjlib-util/resolver.c index 202ad824..d277e4fb 100644 --- a/pjlib-util/src/pjlib-util/resolver.c +++ b/pjlib-util/src/pjlib-util/resolver.c @@ -19,6 +19,7 @@ */ #include #include +#include #include #include #include @@ -309,8 +310,16 @@ static pj_status_t init_sock(pj_dns_resolver *resv) /* Create the UDP socket */ status = pj_sock_socket(pj_AF_INET6(), pj_SOCK_DGRAM(), 0, &resv->udp6_sock); - if (status != PJ_SUCCESS) + if (status != PJ_SUCCESS) { + /* Skip IPv6 socket on system without IPv6 (see ticket #1953) */ + if (status == PJ_STATUS_FROM_OS(OSERR_EAFNOSUPPORT)) { + PJ_LOG(3,(resv->name.ptr, + "System does not support IPv6, resolver will " + "ignore any IPv6 nameservers")); + return PJ_SUCCESS; + } return status; + } /* Bind to any address/port */ pj_sockaddr_init(pj_AF_INET6(), &bound_addr, NULL, 0); @@ -650,7 +659,7 @@ static pj_status_t transmit_query(pj_dns_resolver *resolver, pj_dns_async_query *q) { unsigned pkt_size; - unsigned i, server_cnt; + unsigned i, server_cnt, send_cnt; unsigned servers[PJ_DNS_RESOLVER_MAX_NS]; pj_time_val now; pj_str_t name; @@ -685,8 +694,9 @@ static pj_status_t transmit_query(pj_dns_resolver *resolver, /* Check if the socket is available for sending */ if (pj_ioqueue_is_pending(resolver->udp_key, &resolver->udp_op_tx_key) #if PJ_HAS_IPV6 - || pj_ioqueue_is_pending(resolver->udp6_key, - &resolver->udp6_op_tx_key) + || (resolver->udp6_key && + pj_ioqueue_is_pending(resolver->udp6_key, + &resolver->udp6_op_tx_key)) #endif ) { @@ -714,6 +724,7 @@ static pj_status_t transmit_query(pj_dns_resolver *resolver, pj_gettimeofday(&now); /* Send the packet to name servers */ + send_cnt = 0; for (i=0; iudp_tx_pkt, &sent, 0, &ns->addr, pj_sockaddr_get_len(&ns->addr)); + if (status == PJ_SUCCESS || status == PJ_EPENDING) + send_cnt++; } #if PJ_HAS_IPV6 - else { + else if (resolver->udp6_key) { status = pj_ioqueue_sendto(resolver->udp6_key, &resolver->udp6_op_tx_key, resolver->udp_tx_pkt, &sent, 0, &ns->addr, pj_sockaddr_get_len(&ns->addr)); + if (status == PJ_SUCCESS || status == PJ_EPENDING) + send_cnt++; } #endif + else { + continue; + } PJ_PERROR(4,(resolver->name.ptr, status, "%s %d bytes to NS %d (%s:%d): DNS %s query for %s", @@ -751,6 +769,9 @@ static pj_status_t transmit_query(pj_dns_resolver *resolver, } } + if (send_cnt == 0) + return PJLIB_UTIL_EDNSNOWORKINGNS; + ++q->transmit_cnt; return PJ_SUCCESS; -- cgit v1.2.3