summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2017-02-17 23:50:51 (GMT)
committerEdwin Mons <edwin.mons@isode.com>2017-02-23 08:22:29 (GMT)
commit8a5230c10571f7bb52967d672008ccf603391f2f (patch)
treed108c15b891b637031f869d579195bc412ab3dbb
parent773c181d57085905d8a989f2f1cb644c747e63ab (diff)
downloadswift-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.cpp11
-rw-r--r--Swiften/Component/ComponentSessionStanzaChannel.h4
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,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2017 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -12,6 +12,15 @@
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;
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,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2017 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -22,6 +22,8 @@ namespace Swift {
*/
class SWIFTEN_API ComponentSessionStanzaChannel : public StanzaChannel {
public:
+ virtual ~ComponentSessionStanzaChannel();
+
void setSession(std::shared_ptr<ComponentSession> session);
void sendIQ(std::shared_ptr<IQ> iq);