diff options
author | Joshua Colp <jcolp@digium.com> | 2014-04-30 20:39:17 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2014-04-30 20:39:17 +0000 |
commit | f2a060f5027367de68fb298c31bb661e45cf7f7a (patch) | |
tree | ab61eafc1581122cf87c22c05e2b554f31906c71 /channels/chan_pjsip.c | |
parent | a7fc21783775008497b156505ace634dbbcc09b1 (diff) |
chan_pjsip: Fix deadlock when retrieving call-id of channel.
If a task was in-flight which required the channel or bridge lock
it was possible for the synchronous task retrieving the call-id
to deadlock as it holds those locks.
After discussing with Mark Michelson the synchronous task was
removed and the call-id accessed directly. This should be safe as
each object involved is guaranteed to exist and the call-id will
never change.
........
Merged revisions 413140 from http://svn.asterisk.org/svn/asterisk/branches/12
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@413141 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_pjsip.c')
-rw-r--r-- | channels/chan_pjsip.c | 28 |
1 files changed, 6 insertions, 22 deletions
diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 578150428..8d347e7a0 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -907,34 +907,18 @@ static int chan_pjsip_queryoption(struct ast_channel *ast, int option, void *dat return res; } -struct uniqueid_data { - struct ast_sip_session *session; - char *uniqueid; -}; - -static int get_uniqueid(void *data) -{ - struct uniqueid_data *uid_data = data; - - ast_copy_pj_str(uid_data->uniqueid, &uid_data->session->inv_session->dlg->call_id->id, UNIQUEID_BUFSIZE); - - return 0; -} - static const char *chan_pjsip_get_uniqueid(struct ast_channel *ast) { struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(ast); - struct uniqueid_data uid_data = { - .session = channel->session, - .uniqueid = ast_threadstorage_get(&uniqueid_threadbuf, UNIQUEID_BUFSIZE), - }; + char *uniqueid = ast_threadstorage_get(&uniqueid_threadbuf, UNIQUEID_BUFSIZE); - if (!uid_data.uniqueid || - ast_sip_push_task_synchronous(channel->session->serializer, get_uniqueid, &uid_data)) { - return NULL; + if (!uniqueid) { + return ""; } - return uid_data.uniqueid; + ast_copy_pj_str(uniqueid, &channel->session->inv_session->dlg->call_id->id, UNIQUEID_BUFSIZE); + + return uniqueid; } struct indicate_data { |