]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 179219 via svnmerge from
authorMark Michelson <mmichelson@digium.com>
Sun, 1 Mar 2009 21:57:18 +0000 (21:57 +0000)
committerMark Michelson <mmichelson@digium.com>
Sun, 1 Mar 2009 21:57:18 +0000 (21:57 +0000)
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: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@179221 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 608f78b0816e2b67c2e1db2d75a2c0aa7c151ed4..f4ec29c2c0715ce00383df22f551908a6b15b99d 100644 (file)
@@ -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;