From: Richard Mudgett Date: Tue, 12 May 2015 22:34:45 +0000 (-0500) Subject: chan_dahdi/sig_pri: Fix crash on ISDN call hangup collision. X-Git-Tag: 11.18.0-rc1~10^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bedc7bf8255e7a2b9f100a1c964002cb129ceebf;p=thirdparty%2Fasterisk.git chan_dahdi/sig_pri: Fix crash on ISDN call hangup collision. If an ISDN call is hungup by both sides at the same time a crash could happen. * Added missing NULL checks for the owner channel after calling pri_queue_pvt_cause_data() in two places. Code after those calls need to check the owner channel pointer for NULL before use because pri_queue_pvt_cause_data() needs to do deadlock avoidance to lock the owner and the owner may get hung up. ASTERISK-21893 #close Reported by: Alexandr Gordeev Change-Id: Ica3e266ebc7a894b41d762326f08653e1904bb9a --- diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 0a92c2af7f..15a50c4042 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -6947,10 +6947,11 @@ static void *pri_dchannel(void *vpri) break; } if (pri->pvts[chanpos]->owner) { - int do_hangup = 0; - snprintf(cause_str, sizeof(cause_str), "PRI PRI_EVENT_HANGUP (%d)", e->hangup.cause); pri_queue_pvt_cause_data(pri, chanpos, cause_str, e->hangup.cause); + } + if (pri->pvts[chanpos]->owner) { + int do_hangup = 0; /* Queue a BUSY instead of a hangup if our cause is appropriate */ ast_channel_hangupcause_set(pri->pvts[chanpos]->owner, e->hangup.cause); @@ -7091,10 +7092,11 @@ static void *pri_dchannel(void *vpri) break; } if (pri->pvts[chanpos]->owner) { - int do_hangup = 0; - snprintf(cause_str, sizeof(cause_str), "PRI PRI_EVENT_HANGUP_REQ (%d)", e->hangup.cause); pri_queue_pvt_cause_data(pri, chanpos, cause_str, e->hangup.cause); + } + if (pri->pvts[chanpos]->owner) { + int do_hangup = 0; ast_channel_hangupcause_set(pri->pvts[chanpos]->owner, e->hangup.cause); switch (ast_channel_state(pri->pvts[chanpos]->owner)) {