mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 12:16:00 +00:00
Merge "chan_pjsip.c: Check for channel and session to not be NULL in hangup" into 16
This commit is contained in:
@@ -2342,18 +2342,27 @@ static int hangup(void *data)
|
||||
struct hangup_data *h_data = data;
|
||||
struct ast_channel *ast = h_data->chan;
|
||||
struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(ast);
|
||||
struct ast_sip_session *session = channel->session;
|
||||
int cause = h_data->cause;
|
||||
|
||||
/*
|
||||
* It's possible that session_terminate might cause the session to be destroyed
|
||||
* immediately so we need to keep a reference to it so we can NULL session->channel
|
||||
* afterwards.
|
||||
* Before cleaning we have to ensure that channel or its session is not NULL
|
||||
* we have seen rare case when taskprocessor calls hangup but channel is NULL
|
||||
* due to SIP session timeout and answer happening at the same time
|
||||
*/
|
||||
ast_sip_session_terminate(ao2_bump(session), cause);
|
||||
clear_session_and_channel(session, ast);
|
||||
ao2_cleanup(session);
|
||||
ao2_cleanup(channel);
|
||||
if (channel) {
|
||||
struct ast_sip_session *session = channel->session;
|
||||
if (session) {
|
||||
int cause = h_data->cause;
|
||||
|
||||
/*
|
||||
* It's possible that session_terminate might cause the session to be destroyed
|
||||
* immediately so we need to keep a reference to it so we can NULL session->channel
|
||||
* afterwards.
|
||||
*/
|
||||
ast_sip_session_terminate(ao2_bump(session), cause);
|
||||
clear_session_and_channel(session, ast);
|
||||
ao2_cleanup(session);
|
||||
}
|
||||
ao2_cleanup(channel);
|
||||
}
|
||||
ao2_cleanup(h_data);
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user