diff --git a/apps/confbridge/conf_chan_announce.c b/apps/confbridge/conf_chan_announce.c index 46e074b2064be9d1eafce9373f596607451670e0..af9688437c69a9536a2c34daca027f8d9e0bdf25 100644 --- a/apps/confbridge/conf_chan_announce.c +++ b/apps/confbridge/conf_chan_announce.c @@ -172,8 +172,8 @@ void conf_announce_channel_depart(struct ast_channel *chan) int conf_announce_channel_push(struct ast_channel *ast) { struct ast_bridge_features *features; + struct ast_channel *chan; RAII_VAR(struct announce_pvt *, p, NULL, ao2_cleanup); - RAII_VAR(struct ast_channel *, chan, NULL, ast_channel_unref); { SCOPED_CHANNELLOCK(lock, ast); @@ -192,12 +192,15 @@ int conf_announce_channel_push(struct ast_channel *ast) features = ast_bridge_features_new(); if (!features) { + ast_channel_unref(chan); return -1; } ast_set_flag(&features->feature_flags, AST_BRIDGE_CHANNEL_FLAG_IMMOVABLE); /* Impart the output channel into the bridge */ if (ast_bridge_impart(p->bridge, chan, NULL, features, 0)) { + ast_bridge_features_destroy(features); + ast_channel_unref(chan); return -1; } ao2_lock(p); diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 689b43a05a901620fc1394a3625263f3baa24bda..916fd5ebe5ade2b1e9118842678e0046d7b14bab 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -24777,8 +24777,8 @@ static int handle_request_options(struct sip_pvt *p, struct sip_request *req, st static int handle_invite_replaces(struct sip_pvt *p, struct sip_request *req, int *nounlock, struct sip_pvt *replaces_pvt, struct ast_channel *replaces_chan) { + struct ast_channel *c; RAII_VAR(struct ast_bridge *, bridge, NULL, ao2_cleanup); - RAII_VAR(struct ast_channel *, c, NULL, ao2_cleanup); if (req->ignore) { return 0; @@ -24813,7 +24813,9 @@ static int handle_invite_replaces(struct sip_pvt *p, struct sip_request *req, ast_channel_unlock(replaces_chan); if (bridge) { - ast_bridge_impart(bridge, c, replaces_chan, NULL, 1); + if (ast_bridge_impart(bridge, c, replaces_chan, NULL, 1)) { + ast_hangup(c); + } } else { ast_channel_move(replaces_chan, c); ast_hangup(c); diff --git a/include/asterisk/bridging.h b/include/asterisk/bridging.h index 850245827103758e30d14b8e0b73f386a994f9ec..6e6d73b4a6b90ed1c9f3692f71df2ae7b223e7f4 100644 --- a/include/asterisk/bridging.h +++ b/include/asterisk/bridging.h @@ -654,7 +654,7 @@ enum ast_bridge_channel_state ast_bridge_join(struct ast_bridge *bridge, * \brief Impart (non-blocking) a channel onto a bridge * * \param bridge Bridge to impart on - * \param chan Channel to impart + * \param chan Channel to impart (The channel reference is stolen if impart successful.) * \param swap Channel to swap out if swapping. NULL if not swapping. * \param features Bridge features structure. * \param independent TRUE if caller does not want to reclaim the channel using ast_bridge_depart().