[Asterisk-code-review] channels/chan sip.c: Update dialog fromtag after request wit... (asterisk[13])
Damian Ivereigh
asteriskteam at digium.com
Thu Jun 11 17:14:35 CDT 2015
Damian Ivereigh has uploaded a new change for review.
https://gerrit.asterisk.org/645
Change subject: channels/chan_sip.c: Update dialog fromtag after request with auth
......................................................................
channels/chan_sip.c: Update dialog fromtag after request with auth
If a client sends and INVITE which is 401 rejected, then subsequently
sends a new INVITE with the auth info and uses a different fromtag
from the first INVITE, Asterisk will accept the new INVITE as part of
the original dialog - match_req_to_dialog() specifically ignores the
fromtag. However it does not update the stored dialog with the new
fromtag.
This results in Asterisk being unable to match future packets that are
part of this dialog (such as the ACK to the OK or the OK to the BYE),
and the call is dropped.
This problem was originally found when using an NEC-i SV8100-GE (NEC SIP
Card).
* After a successful match of a packet to the dialog, if the packet is
not a SIP_RESPONSE, authentication is present and the fromtags are
different, the stored fromtag is updated with the one from the recent
INVITE.
ASTERISK-25154 #close
Reported by: Damian Ivereigh
Tested by: Damian Ivereigh
Change-Id: I5c16cf3b409e5ef9f2b2fe974b6bd2a45a6aa17e
Fixed error to make it compile
Change-Id: I5c16cf3b409e5ef9f2b2fe974b6bd2a45a6aa17e
Moved lock/unlock to be outside the if()
Change-Id: I39247e7e450d87a36a61ac025d3a3e0739aa48af
---
M channels/chan_sip.c
1 file changed, 9 insertions(+), 0 deletions(-)
git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/45/645/1
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 5be0200..c56fd6b 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -9240,6 +9240,15 @@
switch (found) {
case SIP_REQ_MATCH:
+ sip_pvt_lock(sip_pvt_ptr);
+ if (args.method != SIP_RESPONSE && args.authentication_present
+ && strcmp(args.fromtag, sip_pvt_ptr.theirtag)) {
+ /* If we have a request that uses athentication and the fromtag is
+ * different from that in the original call dialog, update the
+ * fromtag in the saved call dialog */
+ ast_string_field_set(sip_pvt_ptr, theirtag, args.fromtag);
+ }
+ sip_pvt_unlock(sip_pvt_ptr);
ao2_iterator_destroy(iterator);
dialog_unref(fork_pvt, "unref fork_pvt");
free_via(via);
--
To view, visit https://gerrit.asterisk.org/645
To unsubscribe, visit https://gerrit.asterisk.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I39247e7e450d87a36a61ac025d3a3e0739aa48af
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-Owner: Damian Ivereigh <damo at launtel.net.au>
More information about the asterisk-code-review
mailing list