summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Griepentrog <sgriepentrog@digium.com>2014-07-18 17:42:41 +0000
committerScott Griepentrog <sgriepentrog@digium.com>2014-07-18 17:42:41 +0000
commitf91989d44ee5ee8c202c0808494996bccc5d88e8 (patch)
treeea347a0bee1dbc945e00e8da863a0ffe88b15dd9
parent3ad198c835ff19f4e5703ce0354e02976e0e0f38 (diff)
media formats: fix ref leak of peer for mwi subscription
Holding a reference to the peer during mwi subscriptions resulted in a circular reference because the final event message would not be sent until destruction of the peer. Instead, pass the name of the peer to the event callback so that it can fail gracefully after the peer has gone. ASTERISK-23959 Review: https://reviewboard.asterisk.org/r/3754/ ........ Merged revisions 418636 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@418962 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--channels/chan_sip.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index f76963b39..095b5a763 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -16753,14 +16753,18 @@ static void sip_peer_hold(struct sip_pvt *p, int hold)
/*! \brief Receive MWI events that we have subscribed to */
static void mwi_event_cb(void *userdata, struct stasis_subscription *sub, struct stasis_message *msg)
{
- struct sip_peer *peer = userdata;
+ char *peer_name = userdata;
+ struct sip_peer *peer = sip_find_peer(peer_name, NULL, TRUE, FINDALLDEVICES, FALSE, 0);
+
if (stasis_subscription_final_message(sub, msg)) {
- ao2_cleanup(peer);
+ ast_assert(peer == NULL);
+ ast_free(peer_name);
return;
}
- if (ast_mwi_state_type() == stasis_message_type(msg)) {
+ if (peer && ast_mwi_state_type() == stasis_message_type(msg)) {
sip_send_mwi_to_peer(peer, 0);
}
+ ao2_cleanup(peer);
}
static void network_change_stasis_subscribe(void)
@@ -27293,8 +27297,11 @@ static void add_peer_mwi_subs(struct sip_peer *peer)
mailbox_specific_topic = ast_mwi_topic(mailbox->id);
if (mailbox_specific_topic) {
- ao2_ref(peer, +1);
- mailbox->event_sub = stasis_subscribe(mailbox_specific_topic, mwi_event_cb, peer);
+ char *peer_name = ast_strdup(peer->name);
+ if (!peer_name) {
+ return;
+ }
+ mailbox->event_sub = stasis_subscribe(mailbox_specific_topic, mwi_event_cb, peer_name);
}
}
}