From: David Vossel Date: Wed, 3 Mar 2010 18:05:24 +0000 (+0000) Subject: Merged revisions 250395 via svnmerge from X-Git-Tag: 1.6.1.18-rc1~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=07ff0f5769ad3c3f804b37d103f52c6cf1fbf134;p=thirdparty%2Fasterisk.git Merged revisions 250395 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ................ r250395 | dvossel | 2010-03-03 12:03:19 -0600 (Wed, 03 Mar 2010) | 22 lines Merged revisions 250394 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r250394 | dvossel | 2010-03-03 12:02:27 -0600 (Wed, 03 Mar 2010) | 16 lines fixes problem with duplicate TXREQ packets When Asterisk receives an IAX2 TXREQ packet, try_transfer() will call store_by_transfercallno() to link the chan_iax2_pvt struct into iax_transfercallno_pvts. If a duplicate TXREQ packet is received for the same call, the pvt struct will be linked into iax_transfercallno_pvts multiple times. This patch fixes this. Thanks rain for debugging this and providing a patch! (closes issue #16904) Reported by: rain Patches: iax2-double-txreq-fix.diff uploaded by rain (license 327) Tested by: rain, dvossel ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@250397 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 9ed5c6b07f..b1b10aea65 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -7796,9 +7796,14 @@ static int try_transfer(struct chan_iax2_pvt *pvt, struct iax_ies *ies) memcpy(&pvt->transfer, &new, sizeof(pvt->transfer)); inet_aton(newip, &pvt->transfer.sin_addr); pvt->transfer.sin_family = AF_INET; - pvt->transferring = TRANSFER_BEGIN; pvt->transferid = ies->transferid; - store_by_transfercallno(pvt); + /* only store by transfercallno if this is a new transfer, + * just in case we get a duplicate TXREQ */ + if (pvt->transferring == TRANSFER_NONE) { + store_by_transfercallno(pvt); + } + pvt->transferring = TRANSFER_BEGIN; + if (ies->transferid) iax_ie_append_int(&ied, IAX_IE_TRANSFERID, ies->transferid); send_command_transfer(pvt, AST_FRAME_IAX, IAX_COMMAND_TXCNT, 0, ied.buf, ied.pos); @@ -7892,7 +7897,7 @@ static int complete_transfer(int callno, struct iax_ies *ies) pvt->voiceformat = 0; pvt->svideoformat = -1; pvt->videoformat = 0; - pvt->transfercallno = -1; + pvt->transfercallno = 0; memset(&pvt->rxcore, 0, sizeof(pvt->rxcore)); memset(&pvt->offset, 0, sizeof(pvt->offset)); /* reset jitterbuffer */