summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2009-06-04 15:51:39 +0000
committerBenny Prijono <bennylp@teluu.com>2009-06-04 15:51:39 +0000
commit338ebfefef4eef8bff4a05bbe8544aa46f829c6a (patch)
tree856c2f3ad712ef431f77d4673bd9366b0ac03a03 /pjsip
parentec50b7fbf08b5a826ae9d0cc814edc5406539735 (diff)
Ticket #863: Account may always re-register with IPv6, due to string comparison of IPv6 address. Note: this needs ticket #878)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2745 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_acc.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c
index 689d35b8..5bfa5f04 100644
--- a/pjsip/src/pjsua-lib/pjsua_acc.c
+++ b/pjsip/src/pjsua-lib/pjsua_acc.c
@@ -568,6 +568,10 @@ static pj_bool_t acc_check_nat_addr(pjsua_acc *acc,
int rport;
pjsip_sip_uri *uri;
pjsip_via_hdr *via;
+ pj_sockaddr contact_addr;
+ pj_sockaddr recv_addr;
+ pj_status_t status;
+ pj_bool_t matched;
pj_str_t srv_ip;
tp = param->rdata->tp_info.transport;
@@ -626,9 +630,25 @@ static pj_bool_t acc_check_nat_addr(pjsua_acc *acc,
uri->port = pjsip_transport_get_default_port_for_type(tp_type);
}
- if (uri->port == rport &&
- pj_stricmp(&uri->host, via_addr)==0)
- {
+ /* Convert IP address strings into sockaddr for comparison.
+ * (http://trac.pjsip.org/repos/ticket/863)
+ */
+ status = pj_sockaddr_parse(pj_AF_UNSPEC(), 0, &uri->host,
+ &contact_addr);
+ if (status == PJ_SUCCESS)
+ status = pj_sockaddr_parse(pj_AF_UNSPEC(), 0, via_addr,
+ &recv_addr);
+ if (status == PJ_SUCCESS) {
+ /* Compare the addresses as sockaddr according to the ticket above */
+ matched = (uri->port == rport &&
+ pj_sockaddr_cmp(&contact_addr, &recv_addr)==0);
+ } else {
+ /* Compare the addresses as string, as before */
+ matched = (uri->port == rport &&
+ pj_stricmp(&uri->host, via_addr)==0);
+ }
+
+ if (matched) {
/* Address doesn't change */
pj_pool_release(pool);
return PJ_FALSE;