Skip to content
Snippets Groups Projects
Commit 32f406ed authored by Tristan Matthews's avatar Tristan Matthews
Browse files

* #9851: fixed segfault on stun socket cleanup

We should only store and clean up stun sockets if
a) they don't already exist for the server in question
b) they are valid (created and started successfully)
parent 337f55e3
Branches
Tags
No related merge requests found
...@@ -141,12 +141,7 @@ std::vector<std::string> SipTransport::getAllIpInterface() ...@@ -141,12 +141,7 @@ std::vector<std::string> SipTransport::getAllIpInterface()
} }
SipTransport::SipTransport(pjsip_endpoint *endpt, pj_caching_pool *cp, pj_pool_t *pool) : transportMap_(), stunSocketMap_(), cp_(cp), pool_(pool), endpt_(endpt) SipTransport::SipTransport(pjsip_endpoint *endpt, pj_caching_pool *cp, pj_pool_t *pool) : transportMap_(), stunSocketMap_(), cp_(cp), pool_(pool), endpt_(endpt)
{ {}
}
SipTransport::~SipTransport()
{
}
pj_bool_t pj_bool_t
stun_sock_on_status_cb(pj_stun_sock * /*stun_sock*/, pj_stun_sock_op op, stun_sock_on_status_cb(pj_stun_sock * /*stun_sock*/, pj_stun_sock_op op,
...@@ -192,10 +187,15 @@ stun_sock_on_rx_data_cb(pj_stun_sock * /*stun_sock*/, void * /*pkt*/, ...@@ -192,10 +187,15 @@ stun_sock_on_rx_data_cb(pj_stun_sock * /*stun_sock*/, void * /*pkt*/,
pj_status_t SipTransport::createStunResolver(pj_str_t serverName, pj_uint16_t port) pj_status_t SipTransport::createStunResolver(pj_str_t serverName, pj_uint16_t port)
{ {
pj_stun_config stunCfg; std::string stunResolverName(serverName.ptr, serverName.slen);
pj_stun_config_init(&stunCfg, &cp_->factory, 0, pjsip_endpt_get_ioqueue(endpt_), pjsip_endpt_get_timer_heap(endpt_)); if (stunSocketMap_.find(stunResolverName) != stunSocketMap_.end()) {
DEBUG("SipTransport: %s already added", stunResolverName.c_str());
return PJ_SUCCESS;
}
DEBUG("***************** Create Stun Resolver *********************"); pj_stun_config stunCfg;
pj_stun_config_init(&stunCfg, &cp_->factory, 0,
pjsip_endpt_get_ioqueue(endpt_), pjsip_endpt_get_timer_heap(endpt_));
static const pj_stun_sock_cb stun_sock_cb = { static const pj_stun_sock_cb stun_sock_cb = {
stun_sock_on_rx_data_cb, stun_sock_on_rx_data_cb,
...@@ -203,27 +203,30 @@ pj_status_t SipTransport::createStunResolver(pj_str_t serverName, pj_uint16_t po ...@@ -203,27 +203,30 @@ pj_status_t SipTransport::createStunResolver(pj_str_t serverName, pj_uint16_t po
stun_sock_on_status_cb stun_sock_on_status_cb
}; };
pj_stun_sock *stun_sock; pj_stun_sock *stun_sock = NULL;
std::string stunResolverName(serverName.ptr, serverName.slen); pj_status_t status = pj_stun_sock_create(&stunCfg,
pj_status_t status = pj_stun_sock_create(&stunCfg, stunResolverName.c_str(), pj_AF_INET(), &stun_sock_cb, NULL, NULL, &stun_sock); stunResolverName.c_str(), pj_AF_INET(), &stun_sock_cb, NULL, NULL,
&stun_sock);
// store socket inside list
DEBUG(" insert %s resolver in map", stunResolverName.c_str());
stunSocketMap_.insert(std::pair<std::string, pj_stun_sock *>(stunResolverName, stun_sock));
if (status != PJ_SUCCESS) { if (status != PJ_SUCCESS) {
char errmsg[PJ_ERR_MSG_SIZE]; char errmsg[PJ_ERR_MSG_SIZE];
pj_strerror(status, errmsg, sizeof(errmsg)); pj_strerror(status, errmsg, sizeof(errmsg));
ERROR("SipTransport: Error creating STUN socket for %.*s: %s", (int) serverName.slen, serverName.ptr, errmsg); ERROR("SipTransport: Error creating STUN socket for %.*s: %s",
(int) serverName.slen, serverName.ptr, errmsg);
return status; return status;
} }
status = pj_stun_sock_start(stun_sock, &serverName, port, NULL); status = pj_stun_sock_start(stun_sock, &serverName, port, NULL);
if (status != PJ_SUCCESS) { // store socket inside list
if (status == PJ_SUCCESS) {
DEBUG("SipTransport: Adding %s resolver", stunResolverName.c_str());
stunSocketMap_[stunResolverName] = stun_sock;
} else {
char errmsg[PJ_ERR_MSG_SIZE]; char errmsg[PJ_ERR_MSG_SIZE];
pj_strerror(status, errmsg, sizeof(errmsg)); pj_strerror(status, errmsg, sizeof(errmsg));
DEBUG("SipTransport: Error starting STUN socket for %.*s: %s", (int) serverName.slen, serverName.ptr, errmsg); DEBUG("SipTransport: Error starting STUN socket for %.*s: %s",
(int) serverName.slen, serverName.ptr, errmsg);
pj_stun_sock_destroy(stun_sock); pj_stun_sock_destroy(stun_sock);
} }
...@@ -239,6 +242,7 @@ pj_status_t SipTransport::destroyStunResolver(const std::string &serverName) ...@@ -239,6 +242,7 @@ pj_status_t SipTransport::destroyStunResolver(const std::string &serverName)
if (it != stunSocketMap_.end()) { if (it != stunSocketMap_.end()) {
DEBUG("SipTransport: Deleting stun resolver %s", it->first.c_str()); DEBUG("SipTransport: Deleting stun resolver %s", it->first.c_str());
if (it->second)
pj_stun_sock_destroy(it->second); pj_stun_sock_destroy(it->second);
stunSocketMap_.erase(it); stunSocketMap_.erase(it);
} }
......
...@@ -48,8 +48,6 @@ class SIPAccount; ...@@ -48,8 +48,6 @@ class SIPAccount;
class SipTransport { class SipTransport {
public: public:
SipTransport(pjsip_endpoint *endpt, pj_caching_pool *cp, pj_pool_t *pool); SipTransport(pjsip_endpoint *endpt, pj_caching_pool *cp, pj_pool_t *pool);
~SipTransport();
static std::string getSIPLocalIP(); static std::string getSIPLocalIP();
/** /**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment