[asterisk-commits] russell: branch 1.2 r58242 - /branches/1.2/channels/chan_iax2.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Wed Mar 7 11:17:07 MST 2007


Author: russell
Date: Wed Mar  7 12:17:07 2007
New Revision: 58242

URL: http://svn.digium.com/view/asterisk?view=rev&rev=58242
Log:
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.

Modified:
    branches/1.2/channels/chan_iax2.c

Modified: branches/1.2/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/branches/1.2/channels/chan_iax2.c?view=diff&rev=58242&r1=58241&r2=58242
==============================================================================
--- branches/1.2/channels/chan_iax2.c (original)
+++ branches/1.2/channels/chan_iax2.c Wed Mar  7 12:17:07 2007
@@ -1085,6 +1085,12 @@
 		}
 	}
 	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(iabuf, sizeof(iabuf), sin->sin_addr), ntohs(sin->sin_port));
 		gettimeofday(&now, NULL);
@@ -5035,19 +5041,21 @@
 	int x;
 	struct iax2_user *user = NULL;
 
-	if (ast_test_flag(p, IAX_MAXAUTHREQ)) {
-		ast_mutex_lock(&userl.lock);
-		user = userl.users;
-		while (user) {
-			if (!strcmp(user->name, p->username)) {
-				user->curauthreq--;
-				break;
-			}
-			user = user->next;
-		}
-		ast_mutex_unlock(&userl.lock);
-		ast_clear_flag(p, IAX_MAXAUTHREQ);
-	}
+	ast_mutex_lock(&userl.lock);
+	user = userl.users;
+	while (user) {
+		if (!strcmp(user->name, p->username))
+			break;
+		user = user->next;
+	}
+	if (user) {
+		if (ast_test_flag(p, IAX_MAXAUTHREQ)) {
+			user->curauthreq--;
+			ast_clear_flag(p, IAX_MAXAUTHREQ);
+		}
+		ast_copy_string(p->host, user->name, sizeof(p->host));	
+	}
+	ast_mutex_unlock(&userl.lock);
 
 	if (!ast_test_flag(&p->state, IAX_STATE_AUTHENTICATED))
 		return res;



More information about the asterisk-commits mailing list