summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-12-05 05:08:29 +0000
committerBenny Prijono <bennylp@teluu.com>2007-12-05 05:08:29 +0000
commitd1146bb616cf5387123305fdf79319fc46de437c (patch)
tree9e2f3eecf7dc1d5279c50bd12f8ea8278e73dff2
parent0867865e82fcdd71fc78c90ca9c1c833ef5882d6 (diff)
Fixed run-time error on MacOS X (and possibly BSD based systems) when bind() is called with larger addrlen
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1621 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjlib/src/pj/sock_bsd.c17
-rw-r--r--pjmedia/src/pjmedia/stream.c3
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c2
3 files changed, 19 insertions, 3 deletions
diff --git a/pjlib/src/pj/sock_bsd.c b/pjlib/src/pj/sock_bsd.c
index 761c03bc..1a6d13f8 100644
--- a/pjlib/src/pj/sock_bsd.c
+++ b/pjlib/src/pj/sock_bsd.c
@@ -123,6 +123,18 @@ const int PJ_MSG_PEEK = MSG_PEEK;
const int PJ_MSG_DONTROUTE = MSG_DONTROUTE;
+#if 0
+static void CHECK_ADDR_LEN(const pj_sockaddr *addr, int len)
+{
+ pj_sockaddr *a = (pj_sockaddr*)addr;
+ pj_assert((a->addr.sa_family==PJ_AF_INET && len==sizeof(pj_sockaddr_in)) ||
+ (a->addr.sa_family==PJ_AF_INET6 && len==sizeof(pj_sockaddr_in6)));
+
+}
+#else
+#define CHECK_ADDR_LEN(addr,len)
+#endif
+
/*
* Convert 16-bit value from network byte order to host byte order.
*/
@@ -449,7 +461,6 @@ PJ_DEF(pj_status_t) pj_sock_socket(int af,
}
#endif
-
/*
* Bind socket.
*/
@@ -461,6 +472,8 @@ PJ_DEF(pj_status_t) pj_sock_bind( pj_sock_t sock,
PJ_ASSERT_RETURN(addr && len >= (int)sizeof(struct sockaddr_in), PJ_EINVAL);
+ CHECK_ADDR_LEN(addr, len);
+
if (bind(sock, (struct sockaddr*)addr, len) != 0)
return PJ_RETURN_OS_ERROR(pj_get_native_netos_error());
else
@@ -574,6 +587,8 @@ PJ_DEF(pj_status_t) pj_sock_sendto(pj_sock_t sock,
{
PJ_CHECK_STACK();
PJ_ASSERT_RETURN(len, PJ_EINVAL);
+
+ CHECK_ADDR_LEN(to, tolen);
*len = sendto(sock, (const char*)buf, *len, flags,
(const struct sockaddr*)to, tolen);
diff --git a/pjmedia/src/pjmedia/stream.c b/pjmedia/src/pjmedia/stream.c
index 15c1e887..ba883344 100644
--- a/pjmedia/src/pjmedia/stream.c
+++ b/pjmedia/src/pjmedia/stream.c
@@ -1368,7 +1368,8 @@ PJ_DEF(pj_status_t) pjmedia_stream_create( pjmedia_endpt *endpt,
/* Only attach transport when stream is ready. */
status = pjmedia_transport_attach(tp, stream, &info->rem_addr,
- &info->rem_rtcp, sizeof(info->rem_addr),
+ &info->rem_rtcp,
+ pj_sockaddr_get_len(&info->rem_addr),
&on_rx_rtp, &on_rx_rtcp);
if (status != PJ_SUCCESS)
goto err_cleanup;
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c
index 653d63a0..f7addbd3 100644
--- a/pjsip/src/pjsua-lib/pjsua_core.c
+++ b/pjsip/src/pjsua-lib/pjsua_core.c
@@ -1237,7 +1237,7 @@ static pj_status_t create_sip_udp_sock(int af,
return status;
}
- status = pj_sock_bind(sock, &bind_addr, sizeof(bind_addr));
+ status = pj_sock_bind(sock, &bind_addr, pj_sockaddr_get_len(&bind_addr));
if (status != PJ_SUCCESS) {
pjsua_perror(THIS_FILE, "bind() error", status);
pj_sock_close(sock);