diff options
author | Tobias Markmann <tm@ayena.de> | 2017-02-17 23:50:51 (GMT) |
---|---|---|
committer | Edwin Mons <edwin.mons@isode.com> | 2017-02-23 08:22:29 (GMT) |
commit | 8a5230c10571f7bb52967d672008ccf603391f2f (patch) | |
tree | d108c15b891b637031f869d579195bc412ab3dbb | |
parent | 773c181d57085905d8a989f2f1cb644c747e63ab (diff) | |
download | swift-8a5230c10571f7bb52967d672008ccf603391f2f.zip swift-8a5230c10571f7bb52967d672008ccf603391f2f.tar.bz2 |
Disconnect signals in ComponentSessionStanzaChannel dtor
This is similar to what is currently already done in the
dtor of ClientSessionStanzaChannel.
This should fix potential crashes that have been reported
in Sluift with ASAN enabled, showing a heap-use-after-free
in ComponentSessionStanzaChannel::handleSessionFinished.
Test-Information:
All unit tests pass successfully on macOS 10.12.3 with
clang-5.0.
Change-Id: Id1e95894f9d5fe85922c0e11d18a38d46bd08e3c
-rw-r--r-- | Swiften/Component/ComponentSessionStanzaChannel.cpp | 11 | ||||
-rw-r--r-- | Swiften/Component/ComponentSessionStanzaChannel.h | 4 |
2 files changed, 13 insertions, 2 deletions
diff --git a/Swiften/Component/ComponentSessionStanzaChannel.cpp b/Swiften/Component/ComponentSessionStanzaChannel.cpp index fd61594..e4bf231 100644 --- a/Swiften/Component/ComponentSessionStanzaChannel.cpp +++ b/Swiften/Component/ComponentSessionStanzaChannel.cpp @@ -1,44 +1,53 @@ /* - * Copyright (c) 2010-2016 Isode Limited. + * Copyright (c) 2010-2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Component/ComponentSessionStanzaChannel.h> #include <boost/bind.hpp> #include <Swiften/Base/Log.h> namespace Swift { +ComponentSessionStanzaChannel::~ComponentSessionStanzaChannel() { + if (session) { + session->onInitialized.disconnect(boost::bind(&ComponentSessionStanzaChannel::handleSessionInitialized, this)); + session->onFinished.disconnect(boost::bind(&ComponentSessionStanzaChannel::handleSessionFinished, this, _1)); + session->onStanzaReceived.disconnect(boost::bind(&ComponentSessionStanzaChannel::handleStanza, this, _1)); + session.reset(); + } +} + void ComponentSessionStanzaChannel::setSession(std::shared_ptr<ComponentSession> session) { assert(!this->session); this->session = session; session->onInitialized.connect(boost::bind(&ComponentSessionStanzaChannel::handleSessionInitialized, this)); session->onFinished.connect(boost::bind(&ComponentSessionStanzaChannel::handleSessionFinished, this, _1)); session->onStanzaReceived.connect(boost::bind(&ComponentSessionStanzaChannel::handleStanza, this, _1)); } void ComponentSessionStanzaChannel::sendIQ(std::shared_ptr<IQ> iq) { send(iq); } void ComponentSessionStanzaChannel::sendMessage(std::shared_ptr<Message> message) { send(message); } void ComponentSessionStanzaChannel::sendPresence(std::shared_ptr<Presence> presence) { send(presence); } std::string ComponentSessionStanzaChannel::getNewIQID() { return idGenerator.generateID(); } void ComponentSessionStanzaChannel::send(std::shared_ptr<Stanza> stanza) { if (!isAvailable()) { SWIFT_LOG(warning) << "Component: Trying to send a stanza while disconnected." << std::endl; return; } session->sendStanza(stanza); diff --git a/Swiften/Component/ComponentSessionStanzaChannel.h b/Swiften/Component/ComponentSessionStanzaChannel.h index ad38edc..d8a4501 100644 --- a/Swiften/Component/ComponentSessionStanzaChannel.h +++ b/Swiften/Component/ComponentSessionStanzaChannel.h @@ -1,54 +1,56 @@ /* - * Copyright (c) 2010-2016 Isode Limited. + * Copyright (c) 2010-2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once #include <memory> #include <Swiften/Base/API.h> #include <Swiften/Base/IDGenerator.h> #include <Swiften/Client/StanzaChannel.h> #include <Swiften/Component/ComponentSession.h> #include <Swiften/Elements/IQ.h> #include <Swiften/Elements/Message.h> #include <Swiften/Elements/Presence.h> namespace Swift { /** * StanzaChannel implementation around a ComponentSession. */ class SWIFTEN_API ComponentSessionStanzaChannel : public StanzaChannel { public: + virtual ~ComponentSessionStanzaChannel(); + void setSession(std::shared_ptr<ComponentSession> session); void sendIQ(std::shared_ptr<IQ> iq); void sendMessage(std::shared_ptr<Message> message); void sendPresence(std::shared_ptr<Presence> presence); bool getStreamManagementEnabled() const { return false; } std::vector<Certificate::ref> getPeerCertificateChain() const { // TODO: actually implement this method return std::vector<Certificate::ref>(); } bool isAvailable() const { return session && session->getState() == ComponentSession::Initialized; } private: std::string getNewIQID(); void send(std::shared_ptr<Stanza> stanza); void handleSessionFinished(std::shared_ptr<Error> error); void handleStanza(std::shared_ptr<Stanza> stanza); void handleSessionInitialized(); private: IDGenerator idGenerator; std::shared_ptr<ComponentSession> session; }; |