Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 145837) +++ channels/chan_sip.c (working copy) @@ -14147,24 +14147,38 @@ char *at = strchr(uri, '@'); char *peerorhost; struct sip_pkt *pkt = NULL; + int spiral_res = 0; + struct sip_peer *peer = NULL; if (option_debug > 2) { ast_log(LOG_DEBUG, "Potential spiral detected. Original RURI was %s, new RURI is %s\n", p->initreq.rlPart2, req->rlPart2); } if (at) { - *at = '\0'; + *at++ = '\0'; } /* Parse out "sip:" */ if ((peerorhost = strchr(uri, ':'))) { *peerorhost++ = '\0'; } - create_addr(p, peerorhost); + if (at && (peer = find_peer(peerorhost, NULL, 1, 0))) { + spiral_res = create_addr_from_peer(p, peer); + } else if (at) { + spiral_res = create_addr(p, at); + } else { + spiral_res = create_addr(p, peerorhost); + } ast_string_field_free(p, theirtag); for (pkt = p->packets; pkt; pkt = pkt->next) { if (pkt->seqno == p->icseq && pkt->method == SIP_INVITE) { AST_SCHED_DEL(sched, pkt->retransid); } } - return transmit_invite(p, SIP_INVITE, 1, 3); + if (spiral_res) { + transmit_response(p, "404 Not Found", req); + p->invitestate = INV_COMPLETED; + sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT); + } else { + return transmit_invite(p, SIP_INVITE, 1, 3); + } } }