diff options
Diffstat (limited to 'pjsip/src/pjsua-lib')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_core.c | 53 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 4 |
2 files changed, 49 insertions, 8 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c index dd0b2622..96ca174a 100644 --- a/pjsip/src/pjsua-lib/pjsua_core.c +++ b/pjsip/src/pjsua-lib/pjsua_core.c @@ -678,14 +678,34 @@ static void stun_dns_srv_resolver_cb(void *user_data, * it with gethostbyname() */ if (pjsua_var.ua_cfg.stun_host.slen) { + pj_str_t str_host, str_port; + int port; pj_hostent he; - pjsua_var.stun_status = pj_gethostbyname(&pjsua_var.ua_cfg.stun_host, &he); + str_port.ptr = pj_strchr(&pjsua_var.ua_cfg.stun_host, ':'); + if (str_port.ptr != NULL) { + str_host.ptr = pjsua_var.ua_cfg.stun_host.ptr; + str_host.slen = (str_port.ptr - str_host.ptr); + str_port.ptr++; + str_port.slen = pjsua_var.ua_cfg.stun_host.slen - + str_host.slen - 1; + port = (int)pj_strtoul(&str_port); + if (port < 1 || port > 65535) { + pjsua_perror(THIS_FILE, "Invalid STUN server", PJ_EINVAL); + pjsua_var.stun_status = PJ_EINVAL; + return; + } + } else { + str_host = pjsua_var.ua_cfg.stun_host; + port = 3478; + } + + pjsua_var.stun_status = pj_gethostbyname(&str_host, &he); if (pjsua_var.stun_status == PJ_SUCCESS) { pj_sockaddr_in_init(&pjsua_var.stun_srv.ipv4, NULL, 0); pjsua_var.stun_srv.ipv4.sin_addr = *(pj_in_addr*)he.h_addr; - pjsua_var.stun_srv.ipv4.sin_port = pj_htons((pj_uint16_t)3478); + pjsua_var.stun_srv.ipv4.sin_port = pj_htons((pj_uint16_t)port); PJ_LOG(3,(THIS_FILE, "STUN server %.*s resolved, address is %s:%d", @@ -772,14 +792,35 @@ pj_status_t pjsua_resolve_stun_server(pj_bool_t wait) * gethostbyname(). */ else if (pjsua_var.ua_cfg.stun_host.slen) { + pj_str_t str_host, str_port; + int port; pj_hostent he; - pjsua_var.stun_status = pj_gethostbyname(&pjsua_var.ua_cfg.stun_host, &he); + str_port.ptr = pj_strchr(&pjsua_var.ua_cfg.stun_host, ':'); + if (str_port.ptr != NULL) { + str_host.ptr = pjsua_var.ua_cfg.stun_host.ptr; + str_host.slen = (str_port.ptr - str_host.ptr); + str_port.ptr++; + str_port.slen = pjsua_var.ua_cfg.stun_host.slen - + str_host.slen - 1; + port = (int)pj_strtoul(&str_port); + if (port < 1 || port > 65535) { + pjsua_perror(THIS_FILE, "Invalid STUN server", PJ_EINVAL); + pjsua_var.stun_status = PJ_EINVAL; + return pjsua_var.stun_status; + } + } else { + str_host = pjsua_var.ua_cfg.stun_host; + port = 3478; + } + + + pjsua_var.stun_status = pj_gethostbyname(&str_host, &he); if (pjsua_var.stun_status == PJ_SUCCESS) { pj_sockaddr_in_init(&pjsua_var.stun_srv.ipv4, NULL, 0); pjsua_var.stun_srv.ipv4.sin_addr = *(pj_in_addr*)he.h_addr; - pjsua_var.stun_srv.ipv4.sin_port = pj_htons((pj_uint16_t)3478); + pjsua_var.stun_srv.ipv4.sin_port = pj_htons((pj_uint16_t)port); PJ_LOG(3,(THIS_FILE, "STUN server %.*s resolved, address is %s:%d", @@ -1055,8 +1096,8 @@ static pj_status_t create_sip_udp_sock(pj_in_addr bound_addr, * STUN is specified, resolve the address with STUN. */ status = pjstun_get_mapped_addr(&pjsua_var.cp.factory, 1, &sock, - &stun_srv, 3478, - &stun_srv, 3478, + &stun_srv, pj_ntohs(pjsua_var.stun_srv.ipv4.sin_port), + &stun_srv, pj_ntohs(pjsua_var.stun_srv.ipv4.sin_port), p_pub_addr); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Error contacting STUN server", status); diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index 66efe68c..09c65cbf 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -289,8 +289,8 @@ static pj_status_t create_rtp_rtcp_sock(const pjsua_transport_config *cfg, stun_srv = pj_str(ip_addr); status=pjstun_get_mapped_addr(&pjsua_var.cp.factory, 2, sock, - &stun_srv, 3478, - &stun_srv, 3478, + &stun_srv, pj_ntohs(pjsua_var.stun_srv.ipv4.sin_port), + &stun_srv, pj_ntohs(pjsua_var.stun_srv.ipv4.sin_port), mapped_addr); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "STUN resolve error", status); |