Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add queried names to server address record, and add the address record in parameter for on_verify_cb callback #4256

Merged
merged 5 commits into from
Jan 30, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions pjsip/include/pjsip/sip_resolve.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,9 @@ PJ_BEGIN_DECL
/** Address records. */
typedef struct pjsip_server_address_record
{
/** The queried name. */
pj_str_t name;

/** Preferable transport to be used to contact this address. */
pjsip_transport_type_e type;

Expand Down
5 changes: 5 additions & 0 deletions pjsip/include/pjsip/sip_transport_tls.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@ typedef struct pjsip_tls_on_verify_param {
*/
const pj_sockaddr_t *remote_addr;

/**
* Describes resolved server addresses.
*/
const pjsip_server_addresses *server_addr;

/**
* Describes transport direction.
*/
Expand Down
4 changes: 4 additions & 0 deletions pjsip/src/pjsip/sip_resolve.c
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver,
pjsip_transport_get_type_name(type),
pjsip_transport_get_type_desc(type)));

svr_addr.entry[i].name = target->addr.host;
svr_addr.entry[i].priority = 0;
svr_addr.entry[i].weight = 0;
svr_addr.entry[i].type = type;
Expand Down Expand Up @@ -571,6 +572,7 @@ static void dns_a_callback(void *user_data,
if (rec.addr[i].af != pj_AF_INET())
continue;

srv->entry[srv->count].name = rec.name;
srv->entry[srv->count].type = query->naptr[0].type;
srv->entry[srv->count].priority = 0;
srv->entry[srv->count].weight = 0;
Expand Down Expand Up @@ -633,6 +635,7 @@ static void dns_aaaa_callback(void *user_data,
if (rec.addr[i].af != pj_AF_INET6())
continue;

srv->entry[srv->count].name = rec.name;
srv->entry[srv->count].type = query->naptr[0].type |
PJSIP_TRANSPORT_IPV6;
srv->entry[srv->count].priority = 0;
Expand Down Expand Up @@ -692,6 +695,7 @@ static void srv_resolver_cb(void *user_data,
for (j = 0; j < s->addr_count &&
srv.count < PJSIP_MAX_RESOLVED_ADDRESSES; ++j)
{
srv.entry[srv.count].name = rec->entry[i].server.name;
srv.entry[srv.count].type = query->naptr[0].type;
srv.entry[srv.count].priority = rec->entry[i].priority;
srv.entry[srv.count].weight = rec->entry[i].weight;
Expand Down
36 changes: 26 additions & 10 deletions pjsip/src/pjsip/sip_transport_tls.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ struct tls_transport
pjsip_transport base;
pj_bool_t is_server;
pj_str_t remote_name;
pjsip_server_addresses server_addr;

pj_bool_t is_registered;
pj_bool_t is_closing;
Expand Down Expand Up @@ -166,6 +167,7 @@ static pj_status_t tls_create(struct tls_listener *listener,
const pj_sockaddr *local,
const pj_sockaddr *remote,
const pj_str_t *remote_name,
const pjsip_server_addresses *addr,
pj_grp_lock_t *glock,
struct tls_transport **p_tls);

Expand Down Expand Up @@ -851,6 +853,7 @@ static pj_status_t tls_create( struct tls_listener *listener,
const pj_sockaddr *local,
const pj_sockaddr *remote,
const pj_str_t *remote_name,
const pjsip_server_addresses *addr,
pj_grp_lock_t *glock,
struct tls_transport **p_tls)
{
Expand Down Expand Up @@ -927,6 +930,14 @@ static pj_status_t tls_create( struct tls_listener *listener,
sockaddr_to_host_port(pool, &tls->base.remote_name, remote);
}

if (addr) {
pj_memcpy( &tls->server_addr, addr,
sizeof(pjsip_server_addresses));
for (int i = 0; i < addr->count; ++i) {
pj_strdup(pool, &tls->server_addr.entry[i].name, &addr->entry[i].name);
}
}

tls->base.endpt = listener->endpt;
tls->base.tpmgr = listener->tpmgr;
tls->base.send_msg = &tls_send_msg;
Expand Down Expand Up @@ -1202,6 +1213,7 @@ static pj_status_t lis_create_transport(pjsip_tpfactory *factory,
pj_ssl_sock_param ssock_param;
pj_sockaddr local_addr;
pj_str_t remote_name;
pjsip_server_addresses server_addr;
pj_status_t status;

/* Sanity checks */
Expand All @@ -1221,12 +1233,14 @@ static pj_status_t lis_create_transport(pjsip_tpfactory *factory,
POOL_TP_INIT, POOL_TP_INC);
PJ_ASSERT_RETURN(pool != NULL, PJ_ENOMEM);

/* Get remote host name from tdata */
if (tdata)
/* Get remote host name and DNS queried server addresses from tdata */
if (tdata) {
remote_name = tdata->dest_info.name;
else
server_addr = tdata->dest_info.addr;
} else {
pj_bzero(&remote_name, sizeof(remote_name));

pj_bzero(&server_addr, sizeof(server_addr));
}
/* Build SSL socket param */
pj_ssl_sock_param_default(&ssock_param);
ssock_param.sock_af = (factory->type & PJSIP_TRANSPORT_IPV6) ?
Expand Down Expand Up @@ -1303,7 +1317,7 @@ static pj_status_t lis_create_transport(pjsip_tpfactory *factory,

/* Create the transport descriptor */
status = tls_create(listener, pool, ssock, PJ_FALSE, &local_addr,
rem_addr, &remote_name, glock, &tls);
rem_addr, &remote_name, &server_addr, glock, &tls);
if (status != PJ_SUCCESS)
return status;

Expand Down Expand Up @@ -1482,7 +1496,7 @@ static pj_bool_t on_accept_complete2(pj_ssl_sock_t *ssock,
* Create TLS transport for the new socket.
*/
status = tls_create( listener, NULL, new_ssock, PJ_TRUE,
&ssl_info.local_addr, &tmp_src_addr, NULL,
&ssl_info.local_addr, &tmp_src_addr, NULL, NULL,
sauwming marked this conversation as resolved.
Show resolved Hide resolved
ssl_info.grp_lock, &tls);

if (status != PJ_SUCCESS) {
Expand Down Expand Up @@ -1635,17 +1649,16 @@ static pj_bool_t on_data_sent(pj_ssl_sock_t *ssock,
static pj_bool_t on_verify_cb(pj_ssl_sock_t* ssock, pj_bool_t is_server)
{
pj_bool_t(*verify_cb)(const pjsip_tls_on_verify_param * param) = NULL;
struct tls_transport* tls_trans = NULL;

if (is_server) {
struct tls_listener* tls;

tls = (struct tls_listener*)pj_ssl_sock_get_user_data(ssock);
verify_cb = tls->tls_setting.on_verify_cb;
} else {
struct tls_transport* tls;

tls = (struct tls_transport*)pj_ssl_sock_get_user_data(ssock);
verify_cb = tls->on_verify_cb;
tls_trans = (struct tls_transport*)pj_ssl_sock_get_user_data(ssock);
verify_cb = tls_trans->on_verify_cb;
}

if (verify_cb) {
Expand All @@ -1655,6 +1668,9 @@ static pj_bool_t on_verify_cb(pj_ssl_sock_t* ssock, pj_bool_t is_server)
pj_bzero(&param, sizeof(param));
pj_ssl_sock_get_info(ssock, &info);

if (tls_trans) {
param.server_addr = &tls_trans->server_addr;
}
param.local_addr = &info.local_addr;
param.remote_addr = &info.remote_addr;
param.local_cert_info = info.local_cert_info;
Expand Down
6 changes: 6 additions & 0 deletions pjsip/src/pjsip/sip_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -1371,6 +1371,9 @@ stateless_send_resolver_callback( pj_status_t status,
if (addr && addr != &tdata->dest_info.addr) {
pj_memcpy( &tdata->dest_info.addr, addr,
sizeof(pjsip_server_addresses));
for (int i = 0; i < addr->count; ++i) {
pj_strdup(tdata->pool, &tdata->dest_info.addr.entry[i].name, &addr->entry[i].name);
}
}
pj_assert(tdata->dest_info.addr.count != 0);

Expand Down Expand Up @@ -1832,6 +1835,9 @@ static void send_response_resolver_cb( pj_status_t status, void *token,

/* Update address in send_state. */
pj_memcpy(&send_state->tdata->dest_info.addr, addr, sizeof(*addr));
for (int i = 0; i < send_state->tdata->dest_info.addr.count; ++i) {
pj_strdup(send_state->tdata->pool, &send_state->tdata->dest_info.addr.entry[i].name, &addr->entry[i].name);
}

/* Send response using the transoprt. */
status = pjsip_transport_send( send_state->cur_transport,
Expand Down
Loading