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/branches/1.4@1961 2fbb986a-6c06-0410-b554-c9c1f0a7f128
This commit is contained in:
parent
4011816ead
commit
ad998f6f64
17
q931.c
17
q931.c
@ -7500,9 +7500,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);
|
q931_release_complete(ctrl,c,PRI_CAUSE_INVALID_CALL_REFERENCE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (c->ourcallstate == Q931_CALL_STATE_ACTIVE) {
|
switch (c->ourcallstate) {
|
||||||
q931_status(ctrl, c, PRI_CAUSE_WRONG_MESSAGE);
|
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;
|
break;
|
||||||
|
default:
|
||||||
|
q931_status(ctrl, c, PRI_CAUSE_WRONG_CALL_STATE);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctrl->ev.e = PRI_EVENT_ANSWER;
|
ctrl->ev.e = PRI_EVENT_ANSWER;
|
||||||
@ -7525,7 +7536,6 @@ static int post_handle_q931_message(struct pri *ctrl, struct q931_mh *mh, struct
|
|||||||
if (c->cis_auto_disconnect && c->cis_call) {
|
if (c->cis_auto_disconnect && c->cis_call) {
|
||||||
/* Make sure WE release when we initiate a signalling only connection */
|
/* Make sure WE release when we initiate a signalling only connection */
|
||||||
q931_hangup(ctrl, c, PRI_CAUSE_NORMAL_CLEARING);
|
q931_hangup(ctrl, c, PRI_CAUSE_NORMAL_CLEARING);
|
||||||
break;
|
|
||||||
} else {
|
} else {
|
||||||
c->incoming_ct_state = INCOMING_CT_STATE_IDLE;
|
c->incoming_ct_state = INCOMING_CT_STATE_IDLE;
|
||||||
|
|
||||||
@ -7538,6 +7548,7 @@ static int post_handle_q931_message(struct pri *ctrl, struct q931_mh *mh, struct
|
|||||||
|
|
||||||
return Q931_RES_HAVEEVENT;
|
return Q931_RES_HAVEEVENT;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
case Q931_FACILITY:
|
case Q931_FACILITY:
|
||||||
if (c->newcall) {
|
if (c->newcall) {
|
||||||
q931_release_complete(ctrl,c,PRI_CAUSE_INVALID_CALL_REFERENCE);
|
q931_release_complete(ctrl,c,PRI_CAUSE_INVALID_CALL_REFERENCE);
|
||||||
|
Loading…
Reference in New Issue
Block a user