aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-03-01 21:57:18 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-03-01 21:57:18 +0000
commitc1288e9697a673027b35ad5b34b58ac0d71c2d52 (patch)
treefad972adf65e75b2f61ba7433a13fa6fcdd340ef
parentef2bde00548e25f8703dc8f41cd09c5e52418f42 (diff)
Merged revisions 179219 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r179219 | mmichelson | 2009-03-01 15:45:08 -0600 (Sun, 01 Mar 2009) | 18 lines Properly free memory and remove scheduler entries when a transmission failure occurs. Previously, only the "data" field of the sip_pkt created during __sip_reliable_xmit was freed when XMIT_ERROR was returned by __sip_xmit. When retrans_pkt was called, this inevitably resulted in the reading and writing of freed memory. XMIT_ERROR is a condition meaning that we don't want to attempt resending the packet at all. The proper action to take is to remove the scheduler entry we just created, free the packet's data as well as the packet itself, and unlink it from the list of packets on the sip_pvt structure. (closes issue #14455) Reported by: Nick_Lewis Patches: 14455.patch uploaded by mmichelson (license 60) Tested by: Nick_Lewis ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@179221 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--channels/chan_sip.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 608f78b08..f4ec29c2c 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -3194,8 +3194,10 @@ static enum sip_result __sip_reliable_xmit(struct sip_pvt *p, int seqno, int res
if (xmitres == XMIT_ERROR) { /* Serious network trouble, no need to try again */
append_history(pkt->owner, "XmitErr", "%s", pkt->is_fatal ? "(Critical)" : "(Non-critical)");
ast_log(LOG_ERROR, "Serious Network Trouble; __sip_xmit returns error for pkt data\n");
- if (pkt->data)
- ast_free(pkt->data);
+ AST_SCHED_DEL(sched, pkt->retransid);
+ p->packets = pkt->next;
+ ast_free(pkt->data);
+ ast_free(pkt);
return AST_FAILURE;
} else {
return AST_SUCCESS;