diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2014-12-24 05:46:51 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2014-12-24 05:46:51 +0000 |
commit | 374f998f28d471c6f2daeb55c9a9c1ae8914c128 (patch) | |
tree | fb2d8c5b6603b701f0c22b3fce5f410d8f13ecbb /pjlib-util | |
parent | 09d2deac969f1a66a20e2fd065dadb4bc4ad6341 (diff) |
Ticket #1809: Fixed DNS SRV resolver bug that application callback may be called twice.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4971 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib-util')
-rw-r--r-- | pjlib-util/src/pjlib-util/srv_resolver.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/pjlib-util/src/pjlib-util/srv_resolver.c b/pjlib-util/src/pjlib-util/srv_resolver.c index 805863fc..5c22ac2b 100644 --- a/pjlib-util/src/pjlib-util/srv_resolver.c +++ b/pjlib-util/src/pjlib-util/srv_resolver.c @@ -405,7 +405,7 @@ static void build_server_entries(pj_dns_srv_async_query *query_job, /* Start DNS A record queries for all SRV records in the query_job structure */ static pj_status_t resolve_hostnames(pj_dns_srv_async_query *query_job) { - unsigned i; + unsigned i, err_cnt = 0; pj_status_t err=PJ_SUCCESS, status; query_job->dns_state = PJ_DNS_TYPE_A; @@ -420,6 +420,11 @@ static pj_status_t resolve_hostnames(pj_dns_srv_async_query *query_job) srv->common.type = PJ_DNS_TYPE_A; srv->parent = query_job; + /* See also #1809: dns_callback() will be invoked synchronously when response + * is available in the cache, and var 'query_job->host_resolved' will get + * incremented within the dns_callback(), which will cause this function + * returning false error, so don't use that variable for counting errors. + */ status = pj_dns_resolver_start_query(query_job->resolver, &srv->target_name, PJ_DNS_TYPE_A, 0, @@ -427,11 +432,12 @@ static pj_status_t resolve_hostnames(pj_dns_srv_async_query *query_job) srv, &srv->q_a); if (status != PJ_SUCCESS) { query_job->host_resolved++; + err_cnt++; err = status; } } - return (query_job->host_resolved == query_job->srv_cnt) ? err : PJ_SUCCESS; + return (err_cnt == query_job->srv_cnt) ? err : PJ_SUCCESS; } /* |