From b11f11f8ff9a98a20569e778643a8afc3a50fc06 Mon Sep 17 00:00:00 2001 From: dvossel Date: Wed, 3 Mar 2010 18:02:27 +0000 Subject: 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: http://svn.digium.com/svn/asterisk/branches/1.4@250394 f38db490-d61c-443f-a65b-d21fe96a405b --- channels/chan_iax2.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'channels') diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 7222c0b97..26da02344 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -7088,9 +7088,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); @@ -7197,7 +7202,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 */ -- cgit v1.2.3