]> git.ipfire.org Git - thirdparty/asterisk.git/commit
res_pjsip: Fix infinite recursion when loading transports from realtime 29/2129/11
authorGeorge Joseph <george.joseph@fairview5.com>
Fri, 29 Jan 2016 23:56:42 +0000 (16:56 -0700)
committerGeorge Joseph <george.joseph@fairview5.com>
Tue, 9 Feb 2016 01:08:32 +0000 (18:08 -0700)
commit2451d4e4550336197ee2e482750cc53f30afa352
tree10acfac50575f695f66805e5607822e10610d74d
parent78fa818c1bdcbb5c0bcd5c651e14c7f607ac4997
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
12 files changed:
include/asterisk/res_pjsip.h
res/res_pjsip.c
res/res_pjsip/config_transport.c
res/res_pjsip_endpoint_identifier_anonymous.c
res/res_pjsip_endpoint_identifier_user.c
res/res_pjsip_multihomed.c
res/res_pjsip_nat.c
res/res_pjsip_outbound_registration.c
res/res_pjsip_sdp_rtp.c
res/res_pjsip_session.c
res/res_pjsip_t38.c
res/res_pjsip_transport_websocket.c