diff options
author | Richard Mudgett <rmudgett@digium.com> | 2015-05-12 17:34:45 -0500 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2015-05-12 17:43:09 -0500 |
commit | c780b6e431438fb837832e311c585ba2cb573fec (patch) | |
tree | 6200dd2553231335936ad4fe47bcbdde3bbb5316 /channels/sig_pri.c | |
parent | 3cdb7950f05dbfe0b180a778c48f99f97345958c (diff) |
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
Diffstat (limited to 'channels/sig_pri.c')
-rw-r--r-- | channels/sig_pri.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/channels/sig_pri.c b/channels/sig_pri.c index a66d16b53..2815dac13 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -7102,10 +7102,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); @@ -7246,10 +7247,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)) { |