mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
PJSIP: Prevent T38 framehook being put on wrong channel
This change gives framehooks a reverse-direction masquerade callback in addition to chan_fixup_cb similar to the callback added to datastores to handle the same situation. The new callback provides the same parameters as the fixup callback, but is called on the new channel's framehooks before moving framehooks from the old channel to the new channel. This gives the framehooks an oppurtunity to decide whether they should remain on the new channel or be removed. This new callback is used to prevent the PJSIP T.38 framehook from remaining on a masqueraded channel if the new channel is not also a PJSIP channel. This was causing a crash when a local channel was masqueraded into a PJSIP channel and the framehook was executed on the local channel since the channel's tech private data was not structured as expected. Review: https://reviewboard.asterisk.org/r/4001/ ........ Merged revisions 423503 from http://svn.asterisk.org/svn/asterisk/branches/12 ........ Merged revisions 423504 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@423505 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -440,12 +440,25 @@ static struct ast_frame *t38_framehook(struct ast_channel *chan, struct ast_fram
|
||||
return f;
|
||||
}
|
||||
|
||||
static void t38_masq(void *data, int framehook_id,
|
||||
struct ast_channel *old_chan, struct ast_channel *new_chan)
|
||||
{
|
||||
if (ast_channel_tech(old_chan) == ast_channel_tech(new_chan)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* This framehook is only applicable to PJSIP channels */
|
||||
ast_framehook_detach(new_chan, framehook_id);
|
||||
}
|
||||
|
||||
/*! \brief Function called to attach T.38 framehook to channel when appropriate */
|
||||
static void t38_attach_framehook(struct ast_sip_session *session)
|
||||
{
|
||||
static struct ast_framehook_interface hook = {
|
||||
.version = AST_FRAMEHOOK_INTERFACE_VERSION,
|
||||
.event_cb = t38_framehook,
|
||||
.chan_fixup_cb = t38_masq,
|
||||
.chan_breakdown_cb = t38_masq,
|
||||
};
|
||||
|
||||
/* Only attach the framehook on the first outgoing INVITE or the first incoming INVITE */
|
||||
|
Reference in New Issue
Block a user