fixup: Volte support

Fix crash when cleaning up transport. (re-register)
This commit is contained in:
Andreas Eversberg 2024-05-16 09:26:37 +02:00
parent 717b64fb17
commit 4dc9a6ffc2
2 changed files with 20 additions and 16 deletions

View File

@ -118,17 +118,20 @@ static const pj_str_t AST_PJ_STR_EMPTY = { "", 0 };
*/
struct ast_sip_transport_volte {
/*! Current states for sec-agree */
pj_sockaddr local_addr_c, remote_addr_s;
pj_sockaddr remote_addr_c, local_addr_s;
uint32_t local_spi_c, remote_spi_s;
uint32_t remote_spi_c, local_spi_s;
pj_bool_t local_sa_c_set, remote_sa_s_set;
pj_bool_t remote_sa_c_set, local_sa_s_set;
pj_bool_t local_sp_c_set, remote_sp_s_set;
pj_bool_t remote_sp_c_set, local_sp_s_set;
pj_sockaddr remote_addr_orig;
pj_bool_t transport_set;
char security_server[1024];
pj_sockaddr local_addr_c, remote_addr_s;
pj_sockaddr remote_addr_c, local_addr_s;
uint32_t local_spi_c, remote_spi_s;
uint32_t remote_spi_c, local_spi_s;
pj_bool_t local_sa_c_set, remote_sa_s_set;
pj_bool_t remote_sa_c_set, local_sa_s_set;
pj_bool_t local_sp_c_set, remote_sp_s_set;
pj_bool_t remote_sp_c_set, local_sp_s_set;
pj_sockaddr remote_addr_orig;
char security_server[1024];
/*! Transport that was used (for reset) */
struct pjsip_transport *transport;
/* Assigned URI */
char p_associated_uri[1024];
};
/*!

View File

@ -235,6 +235,7 @@ static pj_status_t volte_set_xfrm(struct ast_sip_transport_state *transport_stat
ast_log(LOG_ERROR, "Given 'ealg' not supported.\n");
return -EINVAL;
}
ast_assert(sizeof(auth_algo.buf) >= 160);
memset(&auth_algo, 0, sizeof(auth_algo));
strcpy(auth_algo.algo.alg_name, g_ipsec_alg[i].kernel_name);
switch (i) {
@ -507,20 +508,20 @@ pj_status_t volte_reset_transport(struct ast_sip_transport_state *transport_stat
/* Cleanup old transport. */
old_port_c = pj_sockaddr_get_port(&transport_state->volte.local_addr_c);
if (old_port_c > 0 && old_port_c < 65535 && transport_state->volte.transport_set) {
if (old_port_c > 0 && old_port_c < 65535 && transport_state->volte.transport) {
/* Create socket with default transport port. */
status = transport_state->transport->create_new_sock(transport_state->transport, NULL);
status = transport_state->volte.transport->create_new_sock(transport_state->volte.transport, NULL);
if (status != PJ_SUCCESS) {
ast_log(LOG_ERROR, "Failed to get connection addresses (errno=%d).\n", errno);
return status;
}
status = transport_state->transport->connect_new_sock(transport_state->transport,
status = transport_state->volte.transport->connect_new_sock(transport_state->volte.transport,
&transport_state->volte.local_addr_c, &transport_state->volte.remote_addr_orig);
if (status != PJ_SUCCESS) {
ast_log(LOG_ERROR, "Failed to change connection addresses (errno=%d).\n", errno);
return status;
}
transport_state->volte.transport_set = PJ_FALSE;
transport_state->volte.transport = NULL;
}
return PJ_SUCCESS;
@ -611,7 +612,7 @@ pj_status_t volte_set_transport(struct ast_sip_transport_state *transport_state,
ast_log(LOG_ERROR, "Failed to change connection addresses (errno=%d).\n", errno);
return status;
}
transport_state->volte.transport_set = PJ_TRUE;
transport_state->volte.transport = tdata->tp_info.transport;
return PJ_SUCCESS;
}