From d1146bb616cf5387123305fdf79319fc46de437c Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Wed, 5 Dec 2007 05:08:29 +0000 Subject: 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 --- pjlib/src/pj/sock_bsd.c | 17 ++++++++++++++++- pjmedia/src/pjmedia/stream.c | 3 ++- pjsip/src/pjsua-lib/pjsua_core.c | 2 +- 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); -- cgit v1.2.3