Fixed ticket #313: Error resolving host in PJSIP resolver when DNS response contains CNAME (thanks Esbjörn Dominique)
git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@1326 74dad513-b988-da41-8d7b-12977e46ad98
This commit is contained in:
parent
0c658c677d
commit
12efe5bda2
|
@ -760,43 +760,76 @@ static void dns_callback(void *user_data,
|
||||||
/* Check that we really have answer */
|
/* Check that we really have answer */
|
||||||
if (status==PJ_SUCCESS && pkt->hdr.anscount != 0) {
|
if (status==PJ_SUCCESS && pkt->hdr.anscount != 0) {
|
||||||
|
|
||||||
|
unsigned srv_idx;
|
||||||
|
|
||||||
/* Update IP address of the corresponding hostname */
|
/* Update IP address of the corresponding hostname */
|
||||||
for (i=0; i<query->srv_cnt; ++i) {
|
for (srv_idx=0; srv_idx<query->srv_cnt; ++srv_idx) {
|
||||||
if (pj_stricmp(&pkt->ans[0].name,
|
if (pj_stricmp(&pkt->ans[0].name,
|
||||||
&query->srv[i].target_name)==0)
|
&query->srv[srv_idx].target_name)==0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == query->srv_cnt) {
|
if (srv_idx == query->srv_cnt) {
|
||||||
PJ_LOG(4,(query->objname,
|
PJ_LOG(4,(query->objname,
|
||||||
"Received answer to DNS A request with no matching "
|
"Received answer to DNS A request with no matching "
|
||||||
"SRV record! The unknown name is %.*s",
|
"SRV record! The unknown name is %.*s",
|
||||||
(int)pkt->ans[0].name.slen, pkt->ans[0].name.ptr));
|
(int)pkt->ans[0].name.slen, pkt->ans[0].name.ptr));
|
||||||
} else {
|
} else {
|
||||||
unsigned j;
|
int ans_idx = -1;
|
||||||
|
unsigned k, j;
|
||||||
|
pj_str_t cname = { NULL, 0 };
|
||||||
|
|
||||||
query->srv[i].addr[query->srv[i].addr_cnt++].s_addr =
|
/* Find the first DNS A record in the answer while processing
|
||||||
pkt->ans[0].rdata.a.ip_addr.s_addr;
|
* the CNAME info found in the response.
|
||||||
|
*/
|
||||||
|
for (k=0; k < pkt->hdr.anscount; ++k) {
|
||||||
|
|
||||||
|
pj_dns_parsed_rr *rr = &pkt->ans[k];
|
||||||
|
|
||||||
|
if (rr->type == PJ_DNS_TYPE_A &&
|
||||||
|
(cname.slen == 0 || pj_stricmp(&rr->name, &cname)==0))
|
||||||
|
{
|
||||||
|
if (ans_idx == -1)
|
||||||
|
ans_idx = k;
|
||||||
|
|
||||||
|
} else if (rr->type == PJ_DNS_TYPE_CNAME &&
|
||||||
|
pj_stricmp(&query->srv[srv_idx].target_name,
|
||||||
|
&rr->name)==0)
|
||||||
|
{
|
||||||
|
cname = rr->rdata.cname.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ans_idx == -1) {
|
||||||
|
/* There's no DNS A answer! */
|
||||||
|
PJ_LOG(5,(query->objname,
|
||||||
|
"No DNS A record in response!"));
|
||||||
|
status = PJLIB_UTIL_EDNSNOANSWERREC;
|
||||||
|
goto on_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
query->srv[srv_idx].addr[query->srv[srv_idx].addr_cnt++].s_addr =
|
||||||
|
pkt->ans[ans_idx].rdata.a.ip_addr.s_addr;
|
||||||
|
|
||||||
PJ_LOG(5,(query->objname,
|
PJ_LOG(5,(query->objname,
|
||||||
"DNS A for %.*s: %s",
|
"DNS A for %.*s: %s",
|
||||||
(int)query->srv[i].target_name.slen,
|
(int)query->srv[srv_idx].target_name.slen,
|
||||||
query->srv[i].target_name.ptr,
|
query->srv[srv_idx].target_name.ptr,
|
||||||
pj_inet_ntoa(pkt->ans[0].rdata.a.ip_addr)));
|
pj_inet_ntoa(pkt->ans[ans_idx].rdata.a.ip_addr)));
|
||||||
|
|
||||||
/* Check for multiple IP addresses */
|
/* Check for multiple IP addresses */
|
||||||
for (j=1; j<pkt->hdr.anscount &&
|
for (j=ans_idx+1; j<pkt->hdr.anscount &&
|
||||||
query->srv[i].addr_cnt < ADDR_MAX_COUNT; ++j)
|
query->srv[srv_idx].addr_cnt < ADDR_MAX_COUNT; ++j)
|
||||||
{
|
{
|
||||||
query->srv[i].addr[query->srv[i].addr_cnt++].s_addr =
|
query->srv[srv_idx].addr[query->srv[srv_idx].addr_cnt++].s_addr =
|
||||||
pkt->ans[j].rdata.a.ip_addr.s_addr;
|
pkt->ans[j].rdata.a.ip_addr.s_addr;
|
||||||
|
|
||||||
PJ_LOG(5,(query->objname,
|
PJ_LOG(5,(query->objname,
|
||||||
"Additional DNS A for %.*s: %s",
|
"Additional DNS A for %.*s: %s",
|
||||||
(int)query->srv[i].target_name.slen,
|
(int)query->srv[srv_idx].target_name.slen,
|
||||||
query->srv[i].target_name.ptr,
|
query->srv[srv_idx].target_name.ptr,
|
||||||
pj_inet_ntoa(pkt->ans[j].rdata.a.ip_addr)));
|
pj_inet_ntoa(pkt->ans[j].rdata.a.ip_addr)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue