Commit 6b47c0da41 for asterisk.org
commit 6b47c0da41e6d370d67e6641a4ef1d16efcfa3f7
Author: Mike Bradeen <mbradeen@sangoma.com>
Date: Fri Oct 16 15:30:14 2026 -0600
res_pjsip: Preserve target hostname for qualified OPTIONS destination
As Asterisk now does the endpoint resolution manually, we need to also manually
copy the hostname from the resolution target as PJProject only does this when
resolving the endpoint itself.
Fixes: #2232
diff --git a/res/res_pjsip/pjsip_options.c b/res/res_pjsip/pjsip_options.c
index 491652bcf4..7d425990e2 100644
--- a/res/res_pjsip/pjsip_options.c
+++ b/res/res_pjsip/pjsip_options.c
@@ -606,6 +606,7 @@ static int sip_options_qualify_resolve_task(void *obj)
for (idx = 0; idx < task_data->count; ++idx) {
pjsip_tx_data *tdata;
+ pjsip_host_info target_dest;
pjsip_via_hdr *via;
pjsip_transaction *tsx = NULL;
@@ -622,6 +623,12 @@ static int sip_options_qualify_resolve_task(void *obj)
continue;
}
+ if (pjsip_get_request_dest(tdata, &target_dest) != PJ_SUCCESS) {
+ pjsip_tx_data_dec_ref(tdata);
+ sip_options_queue_target_result(batch, UNAVAILABLE);
+ continue;
+ }
+
/*
* Build a new request per resolved target so each send gets its own
* transaction and Via branch. Setting exactly one pre-resolved
@@ -638,6 +645,14 @@ static int sip_options_qualify_resolve_task(void *obj)
&task_data->addresses.entry[idx].addr);
pj_strdup(tdata->pool, &tdata->dest_info.addr.entry[0].name,
&task_data->addresses.entry[idx].name);
+
+ /*
+ * PJPROJECT only sets dest_info.name when it does the resolution itself.
+ * Set it here since TLS/WSS uses it for connection reuse and SNI/certificate
+ * verification.
+ */
+ pj_strdup(tdata->pool, &tdata->dest_info.name, &target_dest.addr.host);
+
via = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL);
if (via) {
via->branch_param.slen = 0;