From: Holger Hans Peter Freyther Date: Wed, 10 Apr 2019 04:30:25 +0000 (+0100) Subject: stasis: Call callbacks when imparting fails X-Git-Tag: 16.4.0-rc1~11^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f599ebd29ee01d10383d93222032f216f1b66ae6;p=thirdparty%2Fasterisk.git stasis: Call callbacks when imparting fails After a bridge has been deleted the stasis control will depart the channel and might attempt to re-add it to the dial bridge. The later can fail and this can lead to a situation that the stasis control is unlinked but the after_bridge_cb_failed cb is executed trying to access a dangling control object. Fix it by calling the after_cb's before bridge_channel_impart_signal. ASTERISK-26718 Change-Id: Ib4e8f70d7a21bd54afe3cb51cc6717ef7c355496 --- diff --git a/include/asterisk/bridge.h b/include/asterisk/bridge.h index dc8ebe5ec4..13fa19190d 100644 --- a/include/asterisk/bridge.h +++ b/include/asterisk/bridge.h @@ -594,6 +594,9 @@ enum ast_bridge_impart_flags { * it were placed into the bridge by ast_bridge_join(). * Channels placed into a bridge by ast_bridge_join() are * removed by a third party using ast_bridge_remove(). + * + * \note Any callbacks on the channel will be invoked on failure + * with the reason as AST_BRIDGE_AFTER_CB_REASON_IMPART_FAILED. */ int ast_bridge_impart(struct ast_bridge *bridge, struct ast_channel *chan, diff --git a/main/bridge.c b/main/bridge.c index f3c34d1fe3..9c53cfb5ac 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -1953,6 +1953,7 @@ int ast_bridge_impart(struct ast_bridge *bridge, res = bridge_impart_internal(bridge, chan, swap, features, flags, &cond); if (res) { /* Impart failed. Signal any other waiting impart threads */ + ast_bridge_discard_after_callback(chan, AST_BRIDGE_AFTER_CB_REASON_IMPART_FAILED); bridge_channel_impart_signal(chan); }