From 80a37a02a6f265da6293066ea67949b88f68de8b Mon Sep 17 00:00:00 2001 From: David Vossel Date: Fri, 8 May 2009 21:32:25 +0000 Subject: [PATCH] Merged revisions 193387 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ........ r193387 | dvossel | 2009-05-08 15:32:51 -0500 (Fri, 08 May 2009) | 7 lines TCP not matching valid peer. find_peer() does not find a valid peer when using pvt->recv as the sockaddr_in argument. Because of the way TCP works, the port number in pvt->recv is not what we're looking for at all. There is currently only one place that find_peer searches for a peer using the sockaddr_in argument. If the peer is not found after using pvt->recv (works for UDP since the port number will be correct), a temp sockaddr_in struct is made using the Contact header in the sip_request. This has the correct port number in it. Review: http://reviewboard.digium.com/r/236/ ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.0@193449 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 7ebade4b12..5d535d5127 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -11788,6 +11788,21 @@ static enum check_auth_result check_peer_ok(struct sip_pvt *p, char *of, */ peer = (sipmethod == SIP_SUBSCRIBE) ? find_peer(of, NULL, 1, 0) : find_peer(NULL, &p->recv, 1, 0); + /* If the peer is still not found, try the address and port from the + * contact header. If the transport type is TCP or TLS it is not possible + * to find the peer using p->recv. Because of the way TCP works, the received + * packet's destination port will not match the one the peer table is + * built with. */ + if (!peer && (p->socket.type != SIP_TRANSPORT_UDP)) { + struct sockaddr_in tmpsin; + char contact[SIPBUFSIZE]; + char *tmp; + memcpy(&tmpsin, &p->recv, sizeof(tmpsin)); + ast_copy_string(contact, get_header(req, "Contact"), sizeof(contact)); + tmp = get_in_brackets(contact); + __set_address_from_contact(tmp, &tmpsin, 1); + peer = find_peer(NULL, &tmpsin, 1, 0); + } if (!peer) { if (debug) ast_verbose("No matching peer for '%s' from '%s:%d'\n",