[asterisk-dev] Bridge channel depart (and crash)

Holger Freyther holger at moiji-mobile.com
Mon Apr 22 03:01:24 CDT 2019

I was looking into the crash reported in ASTERISK-26718 and I have uploaded two changes into gerrit to fix the symptom[1] and hopefully address the cause[2] as well. It would be nice if anyone with a better understanding of stasis and the bridging code can provide feedback.

The crash appears to happen because the stasis control app is unlinked/deleted before the registered after bridge callback is called on the channel which is then following a dangling pointer (use after free). This can happen if imparting the call back to the dial bridge fails.

When imparting fails I am now calling ast_bridge_discard_after_callback to cancel the outstanding callback and the crash vanishes. It prints more error messages of having failed to impart the channel but doesn't crash anymore.

Having fixed the symptom/crash I tried to understand the cause. The log message already provides a lot of details:

WARNING[5290][C-00000a96] bridge.c: Channel PJSIP/ic_proxy_endpoint-00000a95 has a PBX thread and cannot be imparted into bridge 4c35dd9c-4f74-4fdb-af35-261dfd875c04

My attempt is to "park" the pbx in the stasis control. I have placed it the depart_channel function before calling add_to_dial_bridge. This makes the warning disappear (and I didn't hit the assert) in my manual tests. Is this the right fix and the right place to fix it? Should it be moved into add_to_dial_bridge?

looking forward to get your feedback


[1] https://gerrit.asterisk.org/c/asterisk/+/11254 
[2] https://gerrit.asterisk.org/c/asterisk/+/11255 

More information about the asterisk-dev mailing list