summaryrefslogtreecommitdiff
path: root/pjlib/src/pj/addr_resolv_sock.c
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2010-01-04 16:54:50 +0000
committerNanang Izzuddin <nanang@teluu.com>2010-01-04 16:54:50 +0000
commit2e7c2feace463e9dc191465271866b51d79e4f1f (patch)
treeb5178f94aa2d7be1f32951bd3e37bb47a4a148f2 /pjlib/src/pj/addr_resolv_sock.c
parent2507130ab774b4f3bc9d9d2021629f5dbf111404 (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.c62
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)++;
}