From: Russell Bryant Date: Thu, 23 Dec 2004 20:21:49 +0000 (+0000) Subject: Don't hold the iaxsl[x] lock while finding the peer, do it ahead of time. X-Git-Tag: 1.0.11.1~322 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=799ff464f294107aa73d425550e4477b1d1a1f0d;p=thirdparty%2Fasterisk.git Don't hold the iaxsl[x] lock while finding the peer, do it ahead of time. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/v1-0@4547 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 3b175a0947..531bdce534 100755 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -641,10 +641,9 @@ static int iax2_getpeername(struct sockaddr_in sin, char *host, int len, int loc return res; } -static struct chan_iax2_pvt *new_iax(struct sockaddr_in *sin, int lockpeer) +static struct chan_iax2_pvt *new_iax(struct sockaddr_in *sin, int lockpeer, const char *host) { struct chan_iax2_pvt *tmp; - char iabuf[INET_ADDRSTRLEN]; tmp = malloc(sizeof(struct chan_iax2_pvt)); if (tmp) { memset(tmp, 0, sizeof(struct chan_iax2_pvt)); @@ -659,8 +658,7 @@ static struct chan_iax2_pvt *new_iax(struct sockaddr_in *sin, int lockpeer) tmp->initid = -1; /* strncpy(tmp->context, context, sizeof(tmp->context)-1); */ strncpy(tmp->exten, "s", sizeof(tmp->exten)-1); - if (!iax2_getpeername(*sin, tmp->host, sizeof(tmp->host), lockpeer)) - snprintf(tmp->host, sizeof(tmp->host), "%s:%d", ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr), ntohs(sin->sin_port)); + strncpy(tmp->host, host, sizeof(tmp->host)-1); } return tmp; } @@ -826,6 +824,8 @@ static int find_callno(unsigned short callno, unsigned short dcallno, struct soc int res = 0; int x; struct timeval now; + char iabuf[INET_ADDRSTRLEN]; + char host[80]; if (new <= NEW_ALLOW) { /* Look for an existing connection first */ for (x=1;(res < 1) && (x= NEW_ALLOW)) { + 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); for (x=1;x