[svn-commits] rmudgett: branch 1.4 r1961 - /branches/1.4/q931.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Sep 7 19:10:10 CDT 2010


Author: rmudgett
Date: Tue Sep  7 19:10:05 2010
New Revision: 1961

URL: http://svnview.digium.com/svn/libpri?view=rev&rev=1961
Log:
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)

Modified:
    branches/1.4/q931.c

Modified: branches/1.4/q931.c
URL: http://svnview.digium.com/svn/libpri/branches/1.4/q931.c?view=diff&rev=1961&r1=1960&r2=1961
==============================================================================
--- branches/1.4/q931.c (original)
+++ branches/1.4/q931.c Tue Sep  7 19:10:05 2010
@@ -7500,9 +7500,20 @@
 			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);
-			break;
+		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;
 		}
 
 		ctrl->ev.e = PRI_EVENT_ANSWER;
@@ -7525,7 +7536,6 @@
 		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;
 
@@ -7538,6 +7548,7 @@
 
 			return Q931_RES_HAVEEVENT;
 		}
+		break;
 	case Q931_FACILITY:
 		if (c->newcall) {
 			q931_release_complete(ctrl,c,PRI_CAUSE_INVALID_CALL_REFERENCE);




More information about the svn-commits mailing list