summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2009-11-09 13:40:26 +0000
committerNanang Izzuddin <nanang@teluu.com>2009-11-09 13:40:26 +0000
commit71fd5297986ebaf30a22dfbabf88a8f0e80a9091 (patch)
treeda5e15518bc6b69411289551c1245583c9f00476 /pjsip
parent428df93dd836dc597c7ef9b44f84a7701ad4c482 (diff)
Ticket #957: Fixed 0.0.0.0:0 address returned by SIP TLS client transport, which would cause 0.0.0.0:0 address in SIP via header.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3000 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/src/pjsip/sip_transport_tls.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/pjsip/src/pjsip/sip_transport_tls.c b/pjsip/src/pjsip/sip_transport_tls.c
index 0748896b..0c9ae7ae 100644
--- a/pjsip/src/pjsip/sip_transport_tls.c
+++ b/pjsip/src/pjsip/sip_transport_tls.c
@@ -527,8 +527,17 @@ static pj_status_t tls_create( struct tls_listener *listener,
(int)pj_ntohs(remote->sin_port));
tls->base.addr_len = sizeof(pj_sockaddr_in);
- pj_memcpy(&tls->base.local_addr, local, sizeof(pj_sockaddr_in));
- sockaddr_to_host_port(pool, &tls->base.local_name, local);
+
+ /* Set initial local address */
+ if (!pj_sockaddr_has_addr(local)) {
+ pj_sockaddr_cp(&tls->base.local_addr,
+ &listener->factory.local_addr);
+ } else {
+ pj_sockaddr_cp(&tls->base.local_addr, local);
+ }
+
+ sockaddr_to_host_port(pool, &tls->base.local_name,
+ (pj_sockaddr_in*)&tls->base.local_addr);
sockaddr_to_host_port(pool, &tls->base.remote_name, remote);
tls->base.endpt = listener->endpt;
@@ -856,32 +865,33 @@ static pj_status_t lis_create_transport(pjsip_tpfactory *factory,
if (tls->has_pending_connect) {
pj_ssl_sock_info info;
- /* Update (again) local address, just in case local address currently
- * set is different now that asynchronous connect() is started.
+ /* Update local address, just in case local address currently set is
+ * different now that asynchronous connect() is started.
*/
/* Retrieve the bound address */
status = pj_ssl_sock_get_info(tls->ssock, &info);
if (status == PJ_SUCCESS) {
- pj_sockaddr_in *tp_addr = (pj_sockaddr_in*)&tls->base.local_addr;
+ pj_uint16_t new_port;
- pj_assert(pj_sockaddr_get_len((pj_sockaddr_t*)&info.local_addr) <=
- sizeof(local_addr));
- pj_sockaddr_cp((pj_sockaddr_t*)&local_addr, (pj_sockaddr_t*)&info.local_addr);
+ new_port = pj_sockaddr_get_port((pj_sockaddr_t*)&info.local_addr);
- /* Some systems (like old Win32 perhaps) may not set local address
- * properly before socket is fully connected.
- */
- if (tp_addr->sin_addr.s_addr != local_addr.sin_addr.s_addr &&
- local_addr.sin_addr.s_addr != 0)
+ if (pj_sockaddr_has_addr((pj_sockaddr_t*)&info.local_addr)) {
+ /* Update sockaddr */
+ pj_sockaddr_cp((pj_sockaddr_t*)&tls->base.local_addr,
+ (pj_sockaddr_t*)&info.local_addr);
+ } else if (new_port && new_port != pj_sockaddr_get_port(
+ (pj_sockaddr_t*)&tls->base.local_addr))
{
- tp_addr->sin_addr.s_addr = local_addr.sin_addr.s_addr;
- tp_addr->sin_port = local_addr.sin_port;
- sockaddr_to_host_port(tls->base.pool, &tls->base.local_name,
- &local_addr);
+ /* Update port only */
+ pj_sockaddr_set_port((pj_sockaddr_t*)&tls->base.local_addr,
+ new_port);
}
+
+ sockaddr_to_host_port(tls->base.pool, &tls->base.local_name,
+ (pj_sockaddr_in*)&tls->base.local_addr);
}
-
+
PJ_LOG(4,(tls->base.obj_name,
"TLS transport %.*s:%d is connecting to %.*s:%d...",
(int)tls->base.local_name.host.slen,