summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorJenkins2 <jenkins2@gerrit.asterisk.org>2018-01-31 17:11:57 -0600
committerGerrit Code Review <gerrit2@gerrit.digium.api>2018-01-31 17:11:57 -0600
commita3e72c308bc1abc62ec05c9efa6416f65e5d5ec3 (patch)
treeecb7bc92242be230315f1d94872d32c4ee9354a5 /res
parent7a6db221ab2156966c7ebc3cb1e571f22d0f1418 (diff)
parent60701b3252d7d3efb682938b2f5f2b688103997c (diff)
Merge "res_pjsip_session: Prevent crash during shutdown."
Diffstat (limited to 'res')
-rw-r--r--res/res_pjsip_session.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c
index 4d4ed4770..5a9134bc7 100644
--- a/res/res_pjsip_session.c
+++ b/res/res_pjsip_session.c
@@ -3425,9 +3425,13 @@ static void handle_incoming_before_media(pjsip_inv_session *inv,
static void session_inv_on_state_changed(pjsip_inv_session *inv, pjsip_event *e)
{
- struct ast_sip_session *session = inv->mod_data[session_module.id];
+ struct ast_sip_session *session;
pjsip_event_id_e type;
+ if (ast_shutdown_final()) {
+ return;
+ }
+
if (e) {
print_debug_details(inv, NULL, e);
type = e->type;
@@ -3435,6 +3439,7 @@ static void session_inv_on_state_changed(pjsip_inv_session *inv, pjsip_event *e)
type = PJSIP_EVENT_UNKNOWN;
}
+ session = inv->mod_data[session_module.id];
if (!session) {
return;
}
@@ -3536,13 +3541,7 @@ static void session_inv_on_tsx_state_changed(pjsip_inv_session *inv, pjsip_trans
struct ast_sip_session *session;
pjsip_tx_data *tdata;
- /*
- * A race condition exists at shutdown where the res_pjsip_session can be
- * unloaded but this callback may still get called afterwards. In this case
- * the id may end up being -1 which is useless to us. To work around this
- * we store the current value and check/use it.
- */
- if (id < 0) {
+ if (ast_shutdown_final()) {
return;
}
@@ -3991,9 +3990,14 @@ static struct pjmedia_sdp_session *create_local_sdp(pjsip_inv_session *inv, stru
static void session_inv_on_rx_offer(pjsip_inv_session *inv, const pjmedia_sdp_session *offer)
{
- struct ast_sip_session *session = inv->mod_data[session_module.id];
+ struct ast_sip_session *session;
pjmedia_sdp_session *answer;
+ if (ast_shutdown_final()) {
+ return;
+ }
+
+ session = inv->mod_data[session_module.id];
if (handle_incoming_sdp(session, offer)) {
return;
}
@@ -4012,9 +4016,14 @@ static void session_inv_on_create_offer(pjsip_inv_session *inv, pjmedia_sdp_sess
static void session_inv_on_media_update(pjsip_inv_session *inv, pj_status_t status)
{
- struct ast_sip_session *session = inv->mod_data[session_module.id];
+ struct ast_sip_session *session;
const pjmedia_sdp_session *local, *remote;
+ if (ast_shutdown_final()) {
+ return;
+ }
+
+ session = inv->mod_data[session_module.id];
if (!session || !session->channel) {
/*
* If we don't have a session or channel then we really
@@ -4037,10 +4046,15 @@ static void session_inv_on_media_update(pjsip_inv_session *inv, pj_status_t stat
static pjsip_redirect_op session_inv_on_redirected(pjsip_inv_session *inv, const pjsip_uri *target, const pjsip_event *e)
{
- struct ast_sip_session *session = inv->mod_data[session_module.id];
+ struct ast_sip_session *session;
const pjsip_sip_uri *uri;
- if (!session->channel) {
+ if (ast_shutdown_final()) {
+ return PJSIP_REDIRECT_STOP;
+ }
+
+ session = inv->mod_data[session_module.id];
+ if (!session || !session->channel) {
return PJSIP_REDIRECT_STOP;
}