From f86aee41f7a7c893f0eba7a01f986f305a5b5200 Mon Sep 17 00:00:00 2001
From: Russell Bryant <russell@russellbryant.com>
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;
-- 
GitLab