diff --git a/res/res_pjsip_nat.c b/res/res_pjsip_nat.c index 3d6f25d5f6..1b5fdd1260 100644 --- a/res/res_pjsip_nat.c +++ b/res/res_pjsip_nat.c @@ -432,12 +432,24 @@ static pj_status_t process_nat(pjsip_tx_data *tdata) } if (!ast_sockaddr_isnull(&transport_state->external_signaling_address)) { - /* Update the contact header with the external address */ - if (uri || (uri = nat_get_contact_sip_uri(tdata))) { - pj_strdup2(tdata->pool, &uri->host, ast_sockaddr_stringify_host(&transport_state->external_signaling_address)); - if (transport->external_signaling_port) { - uri->port = transport->external_signaling_port; - ast_debug(4, "Re-wrote Contact URI port to %d\n", uri->port); + pjsip_cseq_hdr *cseq = PJSIP_MSG_CSEQ_HDR(tdata->msg); + + /* Update the Contact header with the external address. We only do this if + * a CSeq is not present (which should not happen - but we are extra safe), + * if a request is being sent, or if a response is sent that is not a response + * to a REGISTER. We specifically don't do this for a response to a REGISTER + * as the Contact headers would contain the registered Contacts, and not our + * own Contact. + */ + if (!cseq || tdata->msg->type == PJSIP_REQUEST_MSG || + pjsip_method_cmp(&cseq->method, &pjsip_register_method)) { + /* We can only rewrite the URI when one is present */ + if (uri || (uri = nat_get_contact_sip_uri(tdata))) { + pj_strdup2(tdata->pool, &uri->host, ast_sockaddr_stringify_host(&transport_state->external_signaling_address)); + if (transport->external_signaling_port) { + uri->port = transport->external_signaling_port; + ast_debug(4, "Re-wrote Contact URI port to %d\n", uri->port); + } } }