From f86aee41f7a7c893f0eba7a01f986f305a5b5200 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Wed, 7 Mar 2007 18:20:51 +0000 Subject: [PATCH] Merged revisions 58243 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ................ r58243 | russell | 2007-03-07 12:19:19 -0600 (Wed, 07 Mar 2007) | 17 lines (This bug was reported to me by Kinsey Moore) Merged revisions 58242 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r58242 | russell | 2007-03-07 12:17:07 -0600 (Wed, 07 Mar 2007) | 7 lines Fix a problem where the Asterisk channel name could be that of the wrong IAX2 user for a call. This is because the first step of choosing this name is to look for an IAX2 peer that happens to have the same IP/port number that this call is coming from and assuming that is it. However, this is not always correct. So, I have made it change this name after authentication happens since at that point, we have an exact match. ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@58244 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_iax2.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index dde51139e8..3befcb4efe 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -1328,6 +1328,12 @@ static int find_callno(unsigned short callno, unsigned short dcallno, struct soc } } if ((res < 1) && (new >= NEW_ALLOW)) { + /* It may seem odd that we look through the peer list for a name for + * this *incoming* call. Well, it is weird. However, users don't + * have an IP address/port number that we can match against. So, + * this is just checking for a peer that has that IP/port and + * assuming that we have a user of the same name. This isn't always + * correct, but it will be changed if needed after authentication. */ if (!iax2_getpeername(*sin, host, sizeof(host), lockpeer)) snprintf(host, sizeof(host), "%s:%d", ast_inet_ntoa(sin->sin_addr), ntohs(sin->sin_port)); gettimeofday(&now, NULL); @@ -5015,17 +5021,19 @@ static int authenticate_verify(struct chan_iax2_pvt *p, struct iax_ies *ies) int x; struct iax2_user *user = NULL; - if (ast_test_flag(p, IAX_MAXAUTHREQ)) { - AST_LIST_LOCK(&users); - AST_LIST_TRAVERSE(&users, user, entry) { - if (!strcmp(user->name, p->username)) { - user->curauthreq--; - break; - } + AST_LIST_LOCK(&users); + AST_LIST_TRAVERSE(&users, user, entry) { + if (!strcmp(user->name, p->username)) + break; + } + if (user) { + if (ast_test_flag(p, IAX_MAXAUTHREQ)) { + user->curauthreq--; + ast_clear_flag(p, IAX_MAXAUTHREQ); } - AST_LIST_UNLOCK(&users); - ast_clear_flag(p, IAX_MAXAUTHREQ); + ast_string_field_set(p, host, user->name); } + AST_LIST_UNLOCK(&users); if (!ast_test_flag(&p->state, IAX_STATE_AUTHENTICATED)) return res;