mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-22 20:56:39 +00:00
res_pjsip: Fix infinite recursion when loading transports from realtime
Attempting to load a transport from realtime was forcing asterisk into an infinite recursion loop. The first thing transport_apply did was to do a sorcery retrieve by id for an existing transport of the same name. For files, this just returns the previous object from res_sorcery_config's internal container, if any. For realtime, the res_sourcery_realtime driver looks in the database and finds the existing row but now it has to rehydrate it into a sorcery object which means calling... transport_apply. And so it goes. The main issue with loading from realtime (apart from the loop) was that transport stores structures and pointers directly in the ast_sip_transport structure instead of the separate ast_transport_state structure. This patch separates those items into the ast_sip_transport_state structure. The pattern is roughly the same as res_pjsip_outbound_registration. Although all current usages of ast_sip_transport and ast_sip_transport_state were modified to use the new ast_sip_get_transport_state API, the original items are left in ast_sip_transport and kept updated to maintain ABI compatability for third-party modules. They are marked as deprecated and noted that they're now in ast_sip_transport_state. ASTERISK-25606 #close Reported-by: Martin Moučka Change-Id: Ic7a836ea8e786e8def51fe3f8cce855ea54f5f19
This commit is contained in:
@@ -2773,13 +2773,14 @@ static pjsip_inv_callback inv_callback = {
|
||||
/*! \brief Hook for modifying outgoing messages with SDP to contain the proper address information */
|
||||
static void session_outgoing_nat_hook(pjsip_tx_data *tdata, struct ast_sip_transport *transport)
|
||||
{
|
||||
RAII_VAR(struct ast_sip_transport_state *, transport_state, ast_sip_get_transport_state(ast_sorcery_object_get_id(transport)), ao2_cleanup);
|
||||
struct ast_sip_nat_hook *hook = ast_sip_mod_data_get(
|
||||
tdata->mod_data, session_module.id, MOD_DATA_NAT_HOOK);
|
||||
struct pjmedia_sdp_session *sdp;
|
||||
int stream;
|
||||
|
||||
/* SDP produced by us directly will never be multipart */
|
||||
if (hook || !tdata->msg->body || pj_stricmp2(&tdata->msg->body->content_type.type, "application") ||
|
||||
if (!transport_state || hook || !tdata->msg->body || pj_stricmp2(&tdata->msg->body->content_type.type, "application") ||
|
||||
pj_stricmp2(&tdata->msg->body->content_type.subtype, "sdp") || ast_strlen_zero(transport->external_media_address)) {
|
||||
return;
|
||||
}
|
||||
@@ -2793,7 +2794,7 @@ static void session_outgoing_nat_hook(pjsip_tx_data *tdata, struct ast_sip_trans
|
||||
ast_copy_pj_str(host, &sdp->conn->addr, sizeof(host));
|
||||
ast_sockaddr_parse(&addr, host, PARSE_PORT_FORBID);
|
||||
|
||||
if (ast_apply_ha(transport->localnet, &addr) != AST_SENSE_ALLOW) {
|
||||
if (ast_apply_ha(transport_state->localnet, &addr) != AST_SENSE_ALLOW) {
|
||||
pj_strdup2(tdata->pool, &sdp->conn->addr, transport->external_media_address);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user