From 3cb1f6fbce1a4c8f87498d5f167202000dd5ede1 Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Wed, 17 Nov 2010 21:19:19 +0000 Subject: [PATCH] Merged revision 1961 from https://origsvn.digium.com/svn/libpri/branches/1.4 .......... r1961 | rmudgett | 2010-09-07 19:10:05 -0500 (Tue, 07 Sep 2010) | 12 lines Prevent a CONNECT message from sending a CONNECT ACKNOWLEDGE in the wrong state. Filter the processing of the CONNECT message to prevent libpri from sending a CONNECT ACKNOWLEDGE when the call is in an inappropriate state. This can happen when we hang up an outgoing call after the other end has sent a CONNECT but before we have processed the CONNECT. (issue #17360) Reported by: shawkris Patches: issue17360_con_ack_v1.4.patch uploaded by rmudgett (license 664) .......... git-svn-id: https://origsvn.digium.com/svn/libpri/tags/1.4.11.5@2132 2fbb986a-6c06-0410-b554-c9c1f0a7f128 --- q931.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/q931.c b/q931.c index 7fd9ee5..db1a73f 100644 --- a/q931.c +++ b/q931.c @@ -6912,9 +6912,20 @@ static int post_handle_q931_message(struct pri *ctrl, struct q931_mh *mh, struct q931_release_complete(ctrl,c,PRI_CAUSE_INVALID_CALL_REFERENCE); break; } - if (c->ourcallstate == Q931_CALL_STATE_ACTIVE) { - q931_status(ctrl, c, PRI_CAUSE_WRONG_MESSAGE); + switch (c->ourcallstate) { + case Q931_CALL_STATE_CALL_INITIATED: + case Q931_CALL_STATE_OVERLAP_SENDING: + case Q931_CALL_STATE_OUTGOING_CALL_PROCEEDING: + case Q931_CALL_STATE_CALL_DELIVERED: + case Q931_CALL_STATE_CALL_PRESENT: + case Q931_CALL_STATE_CALL_RECEIVED: + case Q931_CALL_STATE_INCOMING_CALL_PROCEEDING: + case Q931_CALL_STATE_OVERLAP_RECEIVING: + /* Accept CONNECT in these states. */ break; + default: + q931_status(ctrl, c, PRI_CAUSE_WRONG_CALL_STATE); + return 0; } UPDATE_OURCALLSTATE(ctrl, c, Q931_CALL_STATE_ACTIVE); c->peercallstate = Q931_CALL_STATE_CONNECT_REQUEST; @@ -6934,7 +6945,6 @@ static int post_handle_q931_message(struct pri *ctrl, struct q931_mh *mh, struct if (c->cis_auto_disconnect && c->cis_call) { /* Make sure WE release when we initiate a signalling only connection */ q931_hangup(ctrl, c, PRI_CAUSE_NORMAL_CLEARING); - break; } else { c->incoming_ct_state = INCOMING_CT_STATE_IDLE; @@ -6947,6 +6957,7 @@ static int post_handle_q931_message(struct pri *ctrl, struct q931_mh *mh, struct return Q931_RES_HAVEEVENT; } + break; case Q931_FACILITY: if (c->newcall) { q931_release_complete(ctrl,c,PRI_CAUSE_INVALID_CALL_REFERENCE);