From 3c69334f0baed352680ca883e982537c7c4b3810 Mon Sep 17 00:00:00 2001 From: Nipa Kumar Date: Wed, 24 Feb 2016 14:27:35 -0800 Subject: [PATCH] Enqueued WriteReadyCb results in accessing a deleted AgentDnsXmppChannel object. We need to UnRegisterWriteReady when the object is deleted. Change-Id: I1f1f39635f792327f91426d728ab70665bcaec94 Closes-Bug:1531556 Closes-Bug:1547735 --- src/bgp/test/bgp_xmpp_channel_test.cc | 1 + src/bgp/test/bgp_xmpp_parse_test.cc | 1 + src/vnsw/agent/controller/controller_dns.cc | 1 + src/vnsw/agent/controller/controller_ifmap.cc | 1 + src/vnsw/agent/controller/controller_peer.cc | 1 + src/vnsw/agent/test/test_cmn_util.h | 1 + src/xmpp/xmpp_channel.h | 1 + src/xmpp/xmpp_channel_mux.h | 2 +- 8 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/bgp/test/bgp_xmpp_channel_test.cc b/src/bgp/test/bgp_xmpp_channel_test.cc index ee82c24da65..d33e7a999a9 100644 --- a/src/bgp/test/bgp_xmpp_channel_test.cc +++ b/src/bgp/test/bgp_xmpp_channel_test.cc @@ -34,6 +34,7 @@ class XmppChannelMock : public XmppChannel { } MOCK_METHOD2(RegisterReceive, void(xmps::PeerId, ReceiveCb)); MOCK_METHOD1(UnRegisterReceive, void(xmps::PeerId)); + MOCK_METHOD1(UnRegisterWriteReady, void(xmps::PeerId)); std::string ToString() const { return string("fake"); } std::string StateName() const { return string("Established"); } diff --git a/src/bgp/test/bgp_xmpp_parse_test.cc b/src/bgp/test/bgp_xmpp_parse_test.cc index 66953129bbb..ae6af6f833a 100644 --- a/src/bgp/test/bgp_xmpp_parse_test.cc +++ b/src/bgp/test/bgp_xmpp_parse_test.cc @@ -27,6 +27,7 @@ class XmppChannelMock : public XmppChannel { } void RegisterReceive(xmps::PeerId id, ReceiveCb callback) { } void UnRegisterReceive(xmps::PeerId id) { } + void UnRegisterWriteReady(xmps::PeerId id) { } string ToString() const { return string("fake"); } string StateName() const { return string("Established"); } diff --git a/src/vnsw/agent/controller/controller_dns.cc b/src/vnsw/agent/controller/controller_dns.cc index e162e2f8b2a..4c0017ecdbf 100644 --- a/src/vnsw/agent/controller/controller_dns.cc +++ b/src/vnsw/agent/controller/controller_dns.cc @@ -30,6 +30,7 @@ AgentDnsXmppChannel::AgentDnsXmppChannel(Agent *agent, AgentDnsXmppChannel::~AgentDnsXmppChannel() { if (channel_) { channel_->UnRegisterReceive(xmps::DNS); + channel_->UnRegisterWriteReady(xmps::DNS); } } diff --git a/src/vnsw/agent/controller/controller_ifmap.cc b/src/vnsw/agent/controller/controller_ifmap.cc index 08e33cf3076..4a76f2742b2 100644 --- a/src/vnsw/agent/controller/controller_ifmap.cc +++ b/src/vnsw/agent/controller/controller_ifmap.cc @@ -36,6 +36,7 @@ AgentIfMapXmppChannel::AgentIfMapXmppChannel(Agent *agent, XmppChannel *channel, AgentIfMapXmppChannel::~AgentIfMapXmppChannel() { channel_->UnRegisterReceive(xmps::CONFIG); + channel_->UnRegisterWriteReady(xmps::CONFIG); } uint64_t AgentIfMapXmppChannel::NewSeqNumber() { diff --git a/src/vnsw/agent/controller/controller_peer.cc b/src/vnsw/agent/controller/controller_peer.cc index f1bc031b48f..1e0455be069 100644 --- a/src/vnsw/agent/controller/controller_peer.cc +++ b/src/vnsw/agent/controller/controller_peer.cc @@ -85,6 +85,7 @@ AgentXmppChannel::~AgentXmppChannel() { BgpPeer *bgp_peer = bgp_peer_id_.get(); assert(bgp_peer == NULL); channel_->UnRegisterReceive(xmps::BGP); + channel_->UnRegisterWriteReady(xmps::BGP); } InetUnicastAgentRouteTable *AgentXmppChannel::PrefixToRouteTable diff --git a/src/vnsw/agent/test/test_cmn_util.h b/src/vnsw/agent/test/test_cmn_util.h index 2e36a952900..013aa62073a 100644 --- a/src/vnsw/agent/test/test_cmn_util.h +++ b/src/vnsw/agent/test/test_cmn_util.h @@ -398,6 +398,7 @@ class XmppChannelMock : public XmppChannel { void Close() { } MOCK_METHOD2(RegisterReceive, void(xmps::PeerId, ReceiveCb)); MOCK_METHOD1(UnRegisterReceive, void(xmps::PeerId)); + MOCK_METHOD1(UnRegisterWriteReady, void(xmps::PeerId)); std::string ToString() const { return string("fake"); } std::string StateName() const { return string("Established"); } diff --git a/src/xmpp/xmpp_channel.h b/src/xmpp/xmpp_channel.h index 0f3067e4ff6..60eed73da9a 100644 --- a/src/xmpp/xmpp_channel.h +++ b/src/xmpp/xmpp_channel.h @@ -48,6 +48,7 @@ class XmppChannel { virtual void RegisterReceive(xmps::PeerId, ReceiveCb) = 0; virtual void UnRegisterReceive(xmps::PeerId) = 0; virtual void RegisterRxMessageTraceCallback(RxMessageTraceCb cb) = 0; + virtual void UnRegisterWriteReady(xmps::PeerId id) = 0; virtual void Close() = 0; virtual std::string ToString() const = 0; virtual std::string StateName() const = 0; diff --git a/src/xmpp/xmpp_channel_mux.h b/src/xmpp/xmpp_channel_mux.h index ea620b26ff5..d55e23b94c1 100644 --- a/src/xmpp/xmpp_channel_mux.h +++ b/src/xmpp/xmpp_channel_mux.h @@ -49,6 +49,7 @@ class XmppChannelMux : public XmppChannel { virtual void ProcessXmppMessage(const XmppStanza::XmppMessage *msg); void WriteReady(const boost::system::error_code &ec); + virtual void UnRegisterWriteReady(xmps::PeerId id); void HandleStateEvent(xmsm::XmState state); @@ -63,7 +64,6 @@ class XmppChannelMux : public XmppChannel { private: void RegisterWriteReady(xmps::PeerId, SendReadyCb); - void UnRegisterWriteReady(xmps::PeerId id); typedef std::map WriteReadyCbMap; typedef std::map ReceiveCbMap;