diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-03-07 18:17:07 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-03-07 18:17:07 +0000 |
commit | e2562a98e3035c94328f73292f8cbbaeb5cf5017 (patch) | |
tree | 852ac83abff02bfb0877bef36ce52cc7192a0e80 /channels/chan_iax2.c | |
parent | 142decb5393274865024e886095d806ea7715fae (diff) |
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: http://svn.digium.com/svn/asterisk/branches/1.2@58242 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_iax2.c')
-rw-r--r-- | channels/chan_iax2.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 1e23a726e..b9d536aab 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -1085,6 +1085,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(iabuf, sizeof(iabuf), sin->sin_addr), ntohs(sin->sin_port)); gettimeofday(&now, NULL); @@ -5035,19 +5041,21 @@ 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_mutex_lock(&userl.lock); - user = userl.users; - while (user) { - if (!strcmp(user->name, p->username)) { - user->curauthreq--; - break; - } - user = user->next; + 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_mutex_unlock(&userl.lock); - 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; |