summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2015-07-17 08:18:04 (GMT)
committerKevin Smith <kevin.smith@isode.com>2015-07-20 11:24:07 (GMT)
commitf10bd4cc1f570b27943d27e536d1dcfbcd55ec6a (patch)
treeeaa855d6b961ea70c854db571ace7127a36f9d8c
parent3e982c0a39d1d1833afaf558fc7b0f7aeffd2d64 (diff)
downloadswift-f10bd4cc1f570b27943d27e536d1dcfbcd55ec6a.zip
swift-f10bd4cc1f570b27943d27e536d1dcfbcd55ec6a.tar.bz2
Do not reallocate FileTransferManager on connect of Clientswift-3.0beta2
Now Client allocates a FileTransferManager in its ctor and frees it in its dtor, like all the other resources of the Client class. This fixes an ASAN crash in the use case where you do a file transfer, go offline and online again and try to start another file transfer. Test-Information: Tested that the mentioned use case does not crash anymore, that file transfers still work, and that FileTransferTest still passes. Change-Id: Iddbcd8522af7df528bdc2b030fe616ad3f0c4701
-rw-r--r--Swiften/Client/Client.cpp37
-rw-r--r--Swiften/FileTransfer/FileTransferManagerImpl.cpp37
-rw-r--r--Swiften/FileTransfer/FileTransferManagerImpl.h16
3 files changed, 43 insertions, 47 deletions
diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp
index 613249b..3bfdd3f 100644
--- a/Swiften/Client/Client.cpp
+++ b/Swiften/Client/Client.cpp
@@ -68,20 +68,37 @@ Client::Client(const JID& jid, const SafeString& password, NetworkFactories* net
nickResolver = new NickResolver(jid.toBare(), roster, vcardManager, mucRegistry);
blindCertificateTrustChecker = new BlindCertificateTrustChecker();
jingleSessionManager = new JingleSessionManager(getIQRouter());
blockListManager = new ClientBlockListManager(getIQRouter());
- fileTransferManager = NULL;
whiteboardSessionManager = NULL;
#ifdef SWIFT_EXPERIMENTAL_WB
whiteboardSessionManager = new WhiteboardSessionManager(getIQRouter(), getStanzaChannel(), presenceOracle, getEntityCapsProvider());
#endif
pubsubManager = new PubSubManagerImpl(getStanzaChannel(), getIQRouter());
+
+#ifdef SWIFT_EXPERIMENTAL_FT
+ fileTransferManager = new FileTransferManagerImpl(
+ getJID(),
+ jingleSessionManager,
+ getIQRouter(),
+ getEntityCapsProvider(),
+ presenceOracle,
+ getNetworkFactories()->getConnectionFactory(),
+ getNetworkFactories()->getConnectionServerFactory(),
+ getNetworkFactories()->getTimerFactory(),
+ getNetworkFactories()->getDomainNameResolver(),
+ getNetworkFactories()->getNetworkEnvironment(),
+ getNetworkFactories()->getNATTraverser(),
+ getNetworkFactories()->getCryptoProvider());
+#else
+ fileTransferManager = new DummyFileTransferManager();
+#endif
}
Client::~Client() {
delete pubsubManager;
delete whiteboardSessionManager;
@@ -123,30 +140,12 @@ XMPPRoster* Client::getRoster() const {
void Client::setSoftwareVersion(const std::string& name, const std::string& version, const std::string& os) {
softwareVersionResponder->setVersion(name, version, os);
}
void Client::handleConnected() {
- delete fileTransferManager;
-#ifdef SWIFT_EXPERIMENTAL_FT
- fileTransferManager = new FileTransferManagerImpl(
- getJID(),
- jingleSessionManager,
- getIQRouter(),
- getEntityCapsProvider(),
- presenceOracle,
- getNetworkFactories()->getConnectionFactory(),
- getNetworkFactories()->getConnectionServerFactory(),
- getNetworkFactories()->getTimerFactory(),
- getNetworkFactories()->getDomainNameResolver(),
- getNetworkFactories()->getNetworkEnvironment(),
- getNetworkFactories()->getNATTraverser(),
- getNetworkFactories()->getCryptoProvider());
-#else
- fileTransferManager = new DummyFileTransferManager();
-#endif
discoManager->handleConnected();
}
void Client::requestRoster() {
// FIXME: We should set this once when the session is finished, but there
// is currently no callback for this
diff --git a/Swiften/FileTransfer/FileTransferManagerImpl.cpp b/Swiften/FileTransfer/FileTransferManagerImpl.cpp
index ab08c45..f4f9517 100644
--- a/Swiften/FileTransfer/FileTransferManagerImpl.cpp
+++ b/Swiften/FileTransfer/FileTransferManagerImpl.cpp
@@ -10,61 +10,58 @@
* See the COPYING file for more information.
*/
#include <Swiften/FileTransfer/FileTransferManagerImpl.h>
#include <boost/bind.hpp>
-#include <boost/filesystem.hpp>
#include <boost/cstdint.hpp>
+#include <boost/filesystem.hpp>
-#include <Swiften/Base/foreach.h>
+#include "Swiften/Disco/EntityCapsProvider.h"
+#include <Swiften/Base/BoostFilesystemVersion.h>
#include <Swiften/Base/Log.h>
#include <Swiften/Base/Path.h>
-#include "Swiften/Disco/EntityCapsProvider.h"
-#include <Swiften/JID/JID.h>
+#include <Swiften/Base/foreach.h>
#include <Swiften/Elements/JingleFileTransferFileInfo.h>
-#include <Swiften/FileTransfer/SOCKS5BytestreamServerManager.h>
-#include <Swiften/FileTransfer/OutgoingFileTransferManager.h>
-#include <Swiften/FileTransfer/IncomingFileTransferManager.h>
+#include <Swiften/Elements/Presence.h>
#include <Swiften/FileTransfer/DefaultFileTransferTransporterFactory.h>
-#include <Swiften/FileTransfer/SOCKS5BytestreamRegistry.h>
+#include <Swiften/FileTransfer/IncomingFileTransferManager.h>
+#include <Swiften/FileTransfer/OutgoingFileTransferManager.h>
#include <Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.h>
-#include <Swiften/Presence/PresenceOracle.h>
-#include <Swiften/Elements/Presence.h>
+#include <Swiften/FileTransfer/SOCKS5BytestreamRegistry.h>
+#include <Swiften/FileTransfer/SOCKS5BytestreamServerManager.h>
+#include <Swiften/JID/JID.h>
#include <Swiften/Network/ConnectionFactory.h>
#include <Swiften/Network/ConnectionServerFactory.h>
#include <Swiften/Network/HostAddress.h>
#include <Swiften/Network/NATTraverser.h>
-
-#include <Swiften/Base/BoostFilesystemVersion.h>
+#include <Swiften/Presence/PresenceOracle.h>
+#include <Swiften/Queries/IQRouter.h>
namespace Swift {
FileTransferManagerImpl::FileTransferManagerImpl(
- const JID& ownFullJID,
+ const JID& ownJID,
JingleSessionManager* jingleSessionManager,
IQRouter* router,
EntityCapsProvider* capsProvider,
PresenceOracle* presOracle,
ConnectionFactory* connectionFactory,
ConnectionServerFactory* connectionServerFactory,
TimerFactory* timerFactory,
DomainNameResolver* domainNameResolver,
NetworkEnvironment* networkEnvironment,
NATTraverser* natTraverser,
CryptoProvider* crypto) :
- ownJID(ownFullJID),
iqRouter(router),
capsProvider(capsProvider),
presenceOracle(presOracle) {
- assert(!ownFullJID.isBare());
-
bytestreamRegistry = new SOCKS5BytestreamRegistry();
s5bServerManager = new SOCKS5BytestreamServerManager(
bytestreamRegistry, connectionServerFactory, networkEnvironment, natTraverser);
- bytestreamProxy = new SOCKS5BytestreamProxiesManager(connectionFactory, timerFactory, domainNameResolver, iqRouter, JID(ownFullJID.getDomain()));
+ bytestreamProxy = new SOCKS5BytestreamProxiesManager(connectionFactory, timerFactory, domainNameResolver, iqRouter, JID(ownJID.getDomain()));
transporterFactory = new DefaultFileTransferTransporterFactory(
bytestreamRegistry,
s5bServerManager,
bytestreamProxy,
&idGenerator,
@@ -163,11 +160,13 @@ OutgoingFileTransfer::ref FileTransferManagerImpl::createOutgoingFileTransfer(
if (fullJID.is_initialized()) {
receipient = fullJID.get();
} else {
return OutgoingFileTransfer::ref();
}
}
-
- return outgoingFTManager->createOutgoingFileTransfer(ownJID, receipient, bytestream, fileInfo, config);
+
+ assert(!iqRouter->getJID().isBare());
+
+ return outgoingFTManager->createOutgoingFileTransfer(iqRouter->getJID(), receipient, bytestream, fileInfo, config);
}
}
diff --git a/Swiften/FileTransfer/FileTransferManagerImpl.h b/Swiften/FileTransfer/FileTransferManagerImpl.h
index de6e857..7a77564 100644
--- a/Swiften/FileTransfer/FileTransferManagerImpl.h
+++ b/Swiften/FileTransfer/FileTransferManagerImpl.h
@@ -9,39 +9,39 @@
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
-#include <vector>
#include <string>
+#include <vector>
-#include <boost/filesystem/path.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/filesystem/path.hpp>
#include <boost/optional.hpp>
#include <Swiften/Base/API.h>
+#include <Swiften/Base/IDGenerator.h>
#include <Swiften/Base/Override.h>
+#include <Swiften/Base/boost_bsignals.h>
+#include <Swiften/Elements/S5BProxyRequest.h>
#include <Swiften/FileTransfer/FileTransferManager.h>
#include <Swiften/FileTransfer/FileTransferOptions.h>
-#include <Swiften/Base/boost_bsignals.h>
-#include <Swiften/Base/IDGenerator.h>
-#include <Swiften/JID/JID.h>
-#include <Swiften/FileTransfer/OutgoingFileTransfer.h>
#include <Swiften/FileTransfer/IncomingFileTransfer.h>
-#include <Swiften/Elements/S5BProxyRequest.h>
+#include <Swiften/FileTransfer/OutgoingFileTransfer.h>
namespace Swift {
class ConnectionFactory;
class ConnectionServerFactory;
class CryptoProvider;
class DomainNameResolver;
class EntityCapsProvider;
class FileTransferTransporterFactory;
class IQRouter;
class IncomingFileTransferManager;
+ class JID;
class JingleSessionManager;
class NATTraverser;
class NetworkEnvironment;
class OutgoingFileTransferManager;
class PresenceOracle;
class ReadBytestream;
@@ -86,14 +86,12 @@ namespace Swift {
void stop();
private:
boost::optional<JID> highestPriorityJIDSupportingFileTransfer(const JID& bareJID);
private:
- JID ownJID;
-
OutgoingFileTransferManager* outgoingFTManager;
IncomingFileTransferManager* incomingFTManager;
FileTransferTransporterFactory* transporterFactory;
IQRouter* iqRouter;
EntityCapsProvider* capsProvider;
PresenceOracle* presenceOracle;