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
No related branches found
No related tags found
No related merge requests found
......@@ -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()
{
}
{}
pj_bool_t
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*/,
pj_status_t SipTransport::createStunResolver(pj_str_t serverName, pj_uint16_t port)
{
pj_stun_config stunCfg;
pj_stun_config_init(&stunCfg, &cp_->factory, 0, pjsip_endpt_get_ioqueue(endpt_), pjsip_endpt_get_timer_heap(endpt_));
std::string stunResolverName(serverName.ptr, serverName.slen);
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 = {
stun_sock_on_rx_data_cb,
......@@ -203,27 +203,30 @@ pj_status_t SipTransport::createStunResolver(pj_str_t serverName, pj_uint16_t po
stun_sock_on_status_cb
};
pj_stun_sock *stun_sock;
std::string stunResolverName(serverName.ptr, serverName.slen);
pj_status_t status = pj_stun_sock_create(&stunCfg, 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));
pj_stun_sock *stun_sock = NULL;
pj_status_t status = pj_stun_sock_create(&stunCfg,
stunResolverName.c_str(), pj_AF_INET(), &stun_sock_cb, NULL, NULL,
&stun_sock);
if (status != PJ_SUCCESS) {
char errmsg[PJ_ERR_MSG_SIZE];
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;
}
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];
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);
}
......@@ -239,7 +242,8 @@ pj_status_t SipTransport::destroyStunResolver(const std::string &serverName)
if (it != stunSocketMap_.end()) {
DEBUG("SipTransport: Deleting stun resolver %s", it->first.c_str());
pj_stun_sock_destroy(it->second);
if (it->second)
pj_stun_sock_destroy(it->second);
stunSocketMap_.erase(it);
}
......
......@@ -48,8 +48,6 @@ class SIPAccount;
class SipTransport {
public:
SipTransport(pjsip_endpoint *endpt, pj_caching_pool *cp, pj_pool_t *pool);
~SipTransport();
static std::string getSIPLocalIP();
/**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment