diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2010-01-04 16:54:50 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2010-01-04 16:54:50 +0000 |
commit | 2e7c2feace463e9dc191465271866b51d79e4f1f (patch) | |
tree | b5178f94aa2d7be1f32951bd3e37bb47a4a148f2 /pjlib/src/pj/addr_resolv_sock.c | |
parent | 2507130ab774b4f3bc9d9d2021629f5dbf111404 (diff) |
Ticket #1010:
- Fixed bug in some APIs of address resolver and IP helper to reset sin_len member of sockaddr.
- Added purity test of sin_len member checking in pjlib test.
- Fixed bug in pj_getaddrinfo() when address family param set to PJ_AF_UNSPEC (assertion raised as it called pj_sockaddr_get_addr() with PJ_AF_UNSPEC too).
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3044 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib/src/pj/addr_resolv_sock.c')
-rw-r--r-- | pjlib/src/pj/addr_resolv_sock.c | 62 |
1 files changed, 42 insertions, 20 deletions
diff --git a/pjlib/src/pj/addr_resolv_sock.c b/pjlib/src/pj/addr_resolv_sock.c index c88cc8f5..57bcd8f1 100644 --- a/pjlib/src/pj/addr_resolv_sock.c +++ b/pjlib/src/pj/addr_resolv_sock.c @@ -73,18 +73,28 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename, /* Check if nodename is IP address */ pj_bzero(&ai[0], sizeof(ai[0])); - ai[0].ai_addr.addr.sa_family = (pj_uint16_t)af; - if (pj_inet_pton(af, nodename, pj_sockaddr_get_addr(&ai[0].ai_addr)) - == PJ_SUCCESS) - { - pj_str_t tmp; + if (af == PJ_AF_UNSPEC) { + if (pj_inet_pton(PJ_AF_INET, nodename, + &ai[0].ai_addr.ipv4.sin_addr) == PJ_SUCCESS) + { + af = PJ_AF_INET; + } + else if (pj_inet_pton(PJ_AF_INET6, nodename, + &ai[0].ai_addr.ipv6.sin6_addr) == PJ_SUCCESS) + { + af = PJ_AF_INET6; + } - tmp.ptr = ai[0].ai_canonname; - pj_strncpy_with_null(&tmp, nodename, PJ_MAX_HOSTNAME); - ai[0].ai_addr.addr.sa_family = (pj_uint16_t)af; - *count = 1; + if (af != PJ_AF_UNSPEC) { + pj_str_t tmp; - return PJ_SUCCESS; + tmp.ptr = ai[0].ai_canonname; + pj_strncpy_with_null(&tmp, nodename, PJ_MAX_HOSTNAME); + ai[0].ai_addr.addr.sa_family = (pj_uint16_t)af; + *count = 1; + + return PJ_SUCCESS; + } } /* Copy node name to null terminated string. */ @@ -121,6 +131,7 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename, /* Store address */ PJ_ASSERT_ON_FAIL(res->ai_addrlen <= sizeof(pj_sockaddr), continue); pj_memcpy(&ai[i].ai_addr, res->ai_addr, res->ai_addrlen); + PJ_SOCKADDR_RESET_LEN(&ai[i].ai_addr); /* Next slot */ ++i; @@ -139,18 +150,28 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename, /* Check if nodename is IP address */ pj_bzero(&ai[0], sizeof(ai[0])); - ai[0].ai_addr.addr.sa_family = (pj_uint16_t)af; - if (pj_inet_pton(af, nodename, pj_sockaddr_get_addr(&ai[0].ai_addr)) - == PJ_SUCCESS) - { - pj_str_t tmp; + if (af == PJ_AF_UNSPEC) { + if (pj_inet_pton(PJ_AF_INET, nodename, + &ai[0].ai_addr.ipv4.sin_addr) == PJ_SUCCESS) + { + af = PJ_AF_INET; + } + else if (pj_inet_pton(PJ_AF_INET6, nodename, + &ai[0].ai_addr.ipv6.sin6_addr) == PJ_SUCCESS) + { + af = PJ_AF_INET6; + } - tmp.ptr = ai[0].ai_canonname; - pj_strncpy_with_null(&tmp, nodename, PJ_MAX_HOSTNAME); - ai[0].ai_addr.addr.sa_family = (pj_uint16_t)af; - *count = 1; + if (af != PJ_AF_UNSPEC) { + pj_str_t tmp; - return PJ_SUCCESS; + tmp.ptr = ai[0].ai_canonname; + pj_strncpy_with_null(&tmp, nodename, PJ_MAX_HOSTNAME); + ai[0].ai_addr.addr.sa_family = (pj_uint16_t)af; + *count = 1; + + return PJ_SUCCESS; + } } if (af == PJ_AF_INET || af == PJ_AF_UNSPEC) { @@ -180,6 +201,7 @@ PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename, ai[*count].ai_addr.ipv4.sin_family = PJ_AF_INET; pj_memcpy(&ai[*count].ai_addr.ipv4.sin_addr, he.h_addr_list[i], he.h_length); + PJ_SOCKADDR_RESET_LEN(&ai[*count].ai_addr); (*count)++; } |