summaryrefslogtreecommitdiff
path: root/pjnath
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2013-02-08 07:33:23 +0000
committerNanang Izzuddin <nanang@teluu.com>2013-02-08 07:33:23 +0000
commit01444a756c3eb047e4c44070dae49aed0359e607 (patch)
tree3378d0324a85505d3727567fefcb09ebb1f9a123 /pjnath
parentcdb0f86fac81b206ee8e260d2b344e36cb3ac0aa (diff)
Re #1610: Workaround for crash in sess_on_send_msg() callback
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4344 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjnath')
-rw-r--r--pjnath/src/pjnath/stun_sock.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/pjnath/src/pjnath/stun_sock.c b/pjnath/src/pjnath/stun_sock.c
index 725c4c8f..3f756f50 100644
--- a/pjnath/src/pjnath/stun_sock.c
+++ b/pjnath/src/pjnath/stun_sock.c
@@ -390,14 +390,19 @@ PJ_DEF(pj_status_t) pj_stun_sock_destroy(pj_stun_sock *stun_sock)
stun_sock->q = NULL;
}
+ if (stun_sock->stun_sess) {
+ pj_stun_session_set_user_data(stun_sock->stun_sess, NULL);
+ }
+
/* Destroy the active socket first just in case we'll get
* stray callback.
*/
if (stun_sock->active_sock != NULL) {
- pj_activesock_set_user_data(stun_sock->active_sock, NULL);
- pj_activesock_close(stun_sock->active_sock);
+ pj_activesock_t *asock = stun_sock->active_sock;
stun_sock->active_sock = NULL;
stun_sock->sock_fd = PJ_INVALID_SOCKET;
+ pj_activesock_set_user_data(asock, NULL);
+ pj_activesock_close(asock);
} else if (stun_sock->sock_fd != PJ_INVALID_SOCKET) {
pj_sock_close(stun_sock->sock_fd);
stun_sock->sock_fd = PJ_INVALID_SOCKET;
@@ -620,6 +625,8 @@ static pj_status_t sess_on_send_msg(pj_stun_session *sess,
pj_ssize_t size;
stun_sock = (pj_stun_sock *) pj_stun_session_get_user_data(sess);
+ if (!stun_sock || !stun_sock->active_sock)
+ return PJ_EINVALIDOP;
pj_assert(token==INTERNAL_MSG_TOKEN);
PJ_UNUSED_ARG(token);
@@ -648,6 +655,8 @@ static void sess_on_request_complete(pj_stun_session *sess,
pj_bool_t resched = PJ_TRUE;
stun_sock = (pj_stun_sock *) pj_stun_session_get_user_data(sess);
+ if (!stun_sock)
+ return;
PJ_UNUSED_ARG(tdata);
PJ_UNUSED_ARG(token);