diff options
Diffstat (limited to 'main/asterisk/400-destroy-no-response-234131.patch')
-rw-r--r-- | main/asterisk/400-destroy-no-response-234131.patch | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/main/asterisk/400-destroy-no-response-234131.patch b/main/asterisk/400-destroy-no-response-234131.patch new file mode 100644 index 0000000000..16eef51090 --- /dev/null +++ b/main/asterisk/400-destroy-no-response-234131.patch @@ -0,0 +1,39 @@ +--- 1.6.0/channels/chan_sip.c 2009/12/10 16:24:36 234130 ++++ 1.6.0/channels/chan_sip.c 2009/12/10 16:30:22 234131 +@@ -4523,6 +4523,9 @@ + ast_queue_control(p->owner, AST_CONTROL_CONGESTION); + ast_channel_unlock(p->owner); + } ++ ++ /* Give the channel a chance to act before we proceed with destruction */ ++ sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT); + } + sip_pvt_unlock(p); + return 0; +@@ -5186,19 +5189,20 @@ + if (needcancel) { /* Outgoing call, not up */ + if (ast_test_flag(&p->flags[0], SIP_OUTGOING)) { + /* stop retransmitting an INVITE that has not received a response */ +- struct sip_pkt *cur; +- for (cur = p->packets; cur; cur = cur->next) { +- __sip_semi_ack(p, cur->seqno, cur->is_resp, cur->method ? cur->method : find_sip_method(cur->data)); +- } +- + /* if we can't send right now, mark it pending */ + if (p->invitestate == INV_CALLING) { + /* We can't send anything in CALLING state */ + ast_set_flag(&p->flags[0], SIP_PENDINGBYE); +- /* Do we need a timer here if we don't hear from them at all? */ ++ __sip_pretend_ack(p); ++ /* Do we need a timer here if we don't hear from them at all? Yes we do or else we will get hung dialogs and those are no fun. */ + sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT); + append_history(p, "DELAY", "Not sending cancel, waiting for timeout"); + } else { ++ struct sip_pkt *cur; ++ ++ for (cur = p->packets; cur; cur = cur->next) { ++ __sip_semi_ack(p, cur->seqno, cur->is_resp, cur->method ? cur->method : find_sip_method(cur->data)); ++ } + p->invitestate = INV_CANCELLED; + /* Send a new request: CANCEL */ + transmit_request(p, SIP_CANCEL, p->lastinvite, XMIT_RELIABLE, FALSE); |