From f2a060f5027367de68fb298c31bb661e45cf7f7a Mon Sep 17 00:00:00 2001 From: Joshua Colp <jcolp@digium.com> Date: Wed, 30 Apr 2014 20:39:17 +0000 Subject: [PATCH] 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 --- channels/chan_pjsip.c | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 5781504289..8d347e7a06 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 { -- GitLab