mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-17 15:29:05 +00:00
Merge "res_pjsip_refer.c: Fix attended transfer race condition crash." into 13
This commit is contained in:
@@ -468,10 +468,20 @@ static struct refer_attended *refer_attended_alloc(struct ast_sip_session *trans
|
|||||||
return attended;
|
return attended;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int defer_termination_cancel(void *data)
|
static int session_end_if_deferred_task(void *data)
|
||||||
{
|
{
|
||||||
struct ast_sip_session *session = data;
|
struct ast_sip_session *session = data;
|
||||||
|
|
||||||
|
ast_sip_session_end_if_deferred(session);
|
||||||
|
ao2_ref(session, -1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int defer_termination_cancel_task(void *data)
|
||||||
|
{
|
||||||
|
struct ast_sip_session *session = data;
|
||||||
|
|
||||||
|
ast_sip_session_end_if_deferred(session);
|
||||||
ast_sip_session_defer_termination_cancel(session);
|
ast_sip_session_defer_termination_cancel(session);
|
||||||
ao2_ref(session, -1);
|
ao2_ref(session, -1);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -513,6 +523,7 @@ static int refer_attended_task(void *data)
|
|||||||
{
|
{
|
||||||
struct refer_attended *attended = data;
|
struct refer_attended *attended = data;
|
||||||
int response;
|
int response;
|
||||||
|
int (*task_cb)(void *data);
|
||||||
|
|
||||||
if (attended->transferer_second->channel) {
|
if (attended->transferer_second->channel) {
|
||||||
ast_debug(3, "Performing a REFER attended transfer - Transferer #1: %s Transferer #2: %s\n",
|
ast_debug(3, "Performing a REFER attended transfer - Transferer #1: %s Transferer #2: %s\n",
|
||||||
@@ -543,13 +554,18 @@ static int refer_attended_task(void *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_sip_session_end_if_deferred(attended->transferer);
|
if (response == 200) {
|
||||||
if (response != 200) {
|
task_cb = session_end_if_deferred_task;
|
||||||
|
} else {
|
||||||
|
task_cb = defer_termination_cancel_task;
|
||||||
|
}
|
||||||
if (!ast_sip_push_task(attended->transferer->serializer,
|
if (!ast_sip_push_task(attended->transferer->serializer,
|
||||||
defer_termination_cancel, attended->transferer)) {
|
task_cb, attended->transferer)) {
|
||||||
/* Gave the ref to the pushed task. */
|
/* Gave the ref to the pushed task. */
|
||||||
attended->transferer = NULL;
|
attended->transferer = NULL;
|
||||||
}
|
} else {
|
||||||
|
/* Do this anyway even though it is the wrong serializer. */
|
||||||
|
ast_sip_session_end_if_deferred(attended->transferer);
|
||||||
}
|
}
|
||||||
|
|
||||||
ao2_ref(attended, -1);
|
ao2_ref(attended, -1);
|
||||||
|
|||||||
Reference in New Issue
Block a user