summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorTerry Wilson <twilson@digium.com>2012-06-27 21:21:27 +0000
committerTerry Wilson <twilson@digium.com>2012-06-27 21:21:27 +0000
commit7d9e0158c3bc528e4e59b225604fb4f39ebd653e (patch)
tree970acfc835accd7d9e12ea5ca311c563c734878b /channels
parent5eb94d7ebbc2c29d4de8201103bcb62ae8afcd31 (diff)
AST-2012-010: Clean up after a reinvite that never gets a final response
The basic problem is that if a re-INVITE is sent by Asterisk and it receives a provisional response, but no final response, then the dialog is never torn down. In addition to leaking memory, this also leaks file descriptors and will eventually lead to Asterisk no longer being able to process calls. This patch just keeps track of whether there is an outstanding re-INVITE, and if there is goes ahead and cleans up everything as though there was no outstanding reinvite. Review: https://reviewboard.asterisk.org/r/2009/ (closes issue ASTERISK-19992) Reported by: Steve Davies Tested by: Steve Davies, Terry Wilson ........ Merged revisions 369436 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 369437 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@369449 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c7
-rw-r--r--channels/sip/include/sip.h1
2 files changed, 6 insertions, 2 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 5efbfbf34..f7a0946ee 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -6492,7 +6492,7 @@ static int sip_hangup(struct ast_channel *ast)
stop_session_timer(p);
}
- if (!p->pendinginvite) {
+ if (!p->pendinginvite || p->ongoing_reinvite) {
struct ast_channel *bridge = ast_bridged_channel(oldowner);
char quality_buf[AST_MAX_USER_FIELD], *quality;
@@ -12539,7 +12539,7 @@ static int transmit_reinvite_with_sdp(struct sip_pvt *p, int t38version, int old
initialize_initreq(p, &req);
p->lastinvite = p->ocseq;
ast_set_flag(&p->flags[0], SIP_OUTGOING); /* Change direction of this dialog */
-
+ p->ongoing_reinvite = 1;
return send_request(p, &req, XMIT_CRITICAL, p->ocseq);
}
@@ -21136,6 +21136,9 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
/* Final response, clear out pending invite */
if ((resp == 200 || resp >= 300) && p->pendinginvite && seqno == p->pendinginvite) {
p->pendinginvite = 0;
+ if (reinvite) {
+ p->ongoing_reinvite = 0;
+ }
}
/* If this is a response to our initial INVITE, we need to set what we can use
diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h
index dbf572388..d7555ba8d 100644
--- a/channels/sip/include/sip.h
+++ b/channels/sip/include/sip.h
@@ -1127,6 +1127,7 @@ struct sip_pvt {
struct sip_auth_container *peerauth;/*!< Realm authentication credentials */
int noncecount; /*!< Nonce-count */
unsigned int stalenonce:1; /*!< Marks the current nonce as responded too */
+ unsigned int ongoing_reinvite:1; /*!< There is a reinvite in progress that might need to be cleaned up */
char lastmsg[256]; /*!< Last Message sent/received */
int amaflags; /*!< AMA Flags */
uint32_t pendinginvite; /*!< Any pending INVITE or state NOTIFY (in subscribe pvt's) ? (seqno of this) */