diff options
| author | Tobias Markmann <tm@ayena.de> | 2015-07-17 08:18:04 (GMT) |
|---|---|---|
| committer | Kevin Smith <kevin.smith@isode.com> | 2015-07-20 11:24:07 (GMT) |
| commit | f10bd4cc1f570b27943d27e536d1dcfbcd55ec6a (patch) | |
| tree | eaa855d6b961ea70c854db571ace7127a36f9d8c | |
| parent | 3e982c0a39d1d1833afaf558fc7b0f7aeffd2d64 (diff) | |
| download | swift-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.cpp | 37 | ||||
| -rw-r--r-- | Swiften/FileTransfer/FileTransferManagerImpl.cpp | 37 | ||||
| -rw-r--r-- | Swiften/FileTransfer/FileTransferManagerImpl.h | 16 |
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 | |||
| @@ -69,18 +69,35 @@ Client::Client(const JID& jid, const SafeString& password, NetworkFactories* net | |||
| 69 | 69 | ||
| 70 | blindCertificateTrustChecker = new BlindCertificateTrustChecker(); | 70 | blindCertificateTrustChecker = new BlindCertificateTrustChecker(); |
| 71 | 71 | ||
| 72 | jingleSessionManager = new JingleSessionManager(getIQRouter()); | 72 | jingleSessionManager = new JingleSessionManager(getIQRouter()); |
| 73 | blockListManager = new ClientBlockListManager(getIQRouter()); | 73 | blockListManager = new ClientBlockListManager(getIQRouter()); |
| 74 | fileTransferManager = NULL; | ||
| 75 | 74 | ||
| 76 | whiteboardSessionManager = NULL; | 75 | whiteboardSessionManager = NULL; |
| 77 | #ifdef SWIFT_EXPERIMENTAL_WB | 76 | #ifdef SWIFT_EXPERIMENTAL_WB |
| 78 | whiteboardSessionManager = new WhiteboardSessionManager(getIQRouter(), getStanzaChannel(), presenceOracle, getEntityCapsProvider()); | 77 | whiteboardSessionManager = new WhiteboardSessionManager(getIQRouter(), getStanzaChannel(), presenceOracle, getEntityCapsProvider()); |
| 79 | #endif | 78 | #endif |
| 80 | 79 | ||
| 81 | pubsubManager = new PubSubManagerImpl(getStanzaChannel(), getIQRouter()); | 80 | pubsubManager = new PubSubManagerImpl(getStanzaChannel(), getIQRouter()); |
| 81 | |||
| 82 | #ifdef SWIFT_EXPERIMENTAL_FT | ||
| 83 | fileTransferManager = new FileTransferManagerImpl( | ||
| 84 | getJID(), | ||
| 85 | jingleSessionManager, | ||
| 86 | getIQRouter(), | ||
| 87 | getEntityCapsProvider(), | ||
| 88 | presenceOracle, | ||
| 89 | getNetworkFactories()->getConnectionFactory(), | ||
| 90 | getNetworkFactories()->getConnectionServerFactory(), | ||
| 91 | getNetworkFactories()->getTimerFactory(), | ||
| 92 | getNetworkFactories()->getDomainNameResolver(), | ||
| 93 | getNetworkFactories()->getNetworkEnvironment(), | ||
| 94 | getNetworkFactories()->getNATTraverser(), | ||
| 95 | getNetworkFactories()->getCryptoProvider()); | ||
| 96 | #else | ||
| 97 | fileTransferManager = new DummyFileTransferManager(); | ||
| 98 | #endif | ||
| 82 | } | 99 | } |
| 83 | 100 | ||
| 84 | Client::~Client() { | 101 | Client::~Client() { |
| 85 | delete pubsubManager; | 102 | delete pubsubManager; |
| 86 | delete whiteboardSessionManager; | 103 | delete whiteboardSessionManager; |
| @@ -124,28 +141,10 @@ XMPPRoster* Client::getRoster() const { | |||
| 124 | void Client::setSoftwareVersion(const std::string& name, const std::string& version, const std::string& os) { | 141 | void Client::setSoftwareVersion(const std::string& name, const std::string& version, const std::string& os) { |
| 125 | softwareVersionResponder->setVersion(name, version, os); | 142 | softwareVersionResponder->setVersion(name, version, os); |
| 126 | } | 143 | } |
| 127 | 144 | ||
| 128 | void Client::handleConnected() { | 145 | void Client::handleConnected() { |
| 129 | delete fileTransferManager; | ||
| 130 | #ifdef SWIFT_EXPERIMENTAL_FT | ||
| 131 | fileTransferManager = new FileTransferManagerImpl( | ||
| 132 | getJID(), | ||
| 133 | jingleSessionManager, | ||
| 134 | getIQRouter(), | ||
| 135 | getEntityCapsProvider(), | ||
| 136 | presenceOracle, | ||
| 137 | getNetworkFactories()->getConnectionFactory(), | ||
| 138 | getNetworkFactories()->getConnectionServerFactory(), | ||
| 139 | getNetworkFactories()->getTimerFactory(), | ||
| 140 | getNetworkFactories()->getDomainNameResolver(), | ||
| 141 | getNetworkFactories()->getNetworkEnvironment(), | ||
| 142 | getNetworkFactories()->getNATTraverser(), | ||
| 143 | getNetworkFactories()->getCryptoProvider()); | ||
| 144 | #else | ||
| 145 | fileTransferManager = new DummyFileTransferManager(); | ||
| 146 | #endif | ||
| 147 | discoManager->handleConnected(); | 146 | discoManager->handleConnected(); |
| 148 | } | 147 | } |
| 149 | 148 | ||
| 150 | void Client::requestRoster() { | 149 | void Client::requestRoster() { |
| 151 | // FIXME: We should set this once when the session is finished, but there | 150 | // FIXME: We should set this once when the session is finished, but there |
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 | |||
| @@ -11,38 +11,38 @@ | |||
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #include <Swiften/FileTransfer/FileTransferManagerImpl.h> | 13 | #include <Swiften/FileTransfer/FileTransferManagerImpl.h> |
| 14 | 14 | ||
| 15 | #include <boost/bind.hpp> | 15 | #include <boost/bind.hpp> |
| 16 | #include <boost/filesystem.hpp> | ||
| 17 | #include <boost/cstdint.hpp> | 16 | #include <boost/cstdint.hpp> |
| 17 | #include <boost/filesystem.hpp> | ||
| 18 | 18 | ||
| 19 | #include <Swiften/Base/foreach.h> | 19 | #include "Swiften/Disco/EntityCapsProvider.h" |
| 20 | #include <Swiften/Base/BoostFilesystemVersion.h> | ||
| 20 | #include <Swiften/Base/Log.h> | 21 | #include <Swiften/Base/Log.h> |
| 21 | #include <Swiften/Base/Path.h> | 22 | #include <Swiften/Base/Path.h> |
| 22 | #include "Swiften/Disco/EntityCapsProvider.h" | 23 | #include <Swiften/Base/foreach.h> |
| 23 | #include <Swiften/JID/JID.h> | ||
| 24 | #include <Swiften/Elements/JingleFileTransferFileInfo.h> | 24 | #include <Swiften/Elements/JingleFileTransferFileInfo.h> |
| 25 | #include <Swiften/FileTransfer/SOCKS5BytestreamServerManager.h> | 25 | #include <Swiften/Elements/Presence.h> |
| 26 | #include <Swiften/FileTransfer/OutgoingFileTransferManager.h> | ||
| 27 | #include <Swiften/FileTransfer/IncomingFileTransferManager.h> | ||
| 28 | #include <Swiften/FileTransfer/DefaultFileTransferTransporterFactory.h> | 26 | #include <Swiften/FileTransfer/DefaultFileTransferTransporterFactory.h> |
| 29 | #include <Swiften/FileTransfer/SOCKS5BytestreamRegistry.h> | 27 | #include <Swiften/FileTransfer/IncomingFileTransferManager.h> |
| 28 | #include <Swiften/FileTransfer/OutgoingFileTransferManager.h> | ||
| 30 | #include <Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.h> | 29 | #include <Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.h> |
| 31 | #include <Swiften/Presence/PresenceOracle.h> | 30 | #include <Swiften/FileTransfer/SOCKS5BytestreamRegistry.h> |
| 32 | #include <Swiften/Elements/Presence.h> | 31 | #include <Swiften/FileTransfer/SOCKS5BytestreamServerManager.h> |
| 32 | #include <Swiften/JID/JID.h> | ||
| 33 | #include <Swiften/Network/ConnectionFactory.h> | 33 | #include <Swiften/Network/ConnectionFactory.h> |
| 34 | #include <Swiften/Network/ConnectionServerFactory.h> | 34 | #include <Swiften/Network/ConnectionServerFactory.h> |
| 35 | #include <Swiften/Network/HostAddress.h> | 35 | #include <Swiften/Network/HostAddress.h> |
| 36 | #include <Swiften/Network/NATTraverser.h> | 36 | #include <Swiften/Network/NATTraverser.h> |
| 37 | 37 | #include <Swiften/Presence/PresenceOracle.h> | |
| 38 | #include <Swiften/Base/BoostFilesystemVersion.h> | 38 | #include <Swiften/Queries/IQRouter.h> |
| 39 | 39 | ||
| 40 | namespace Swift { | 40 | namespace Swift { |
| 41 | 41 | ||
| 42 | FileTransferManagerImpl::FileTransferManagerImpl( | 42 | FileTransferManagerImpl::FileTransferManagerImpl( |
| 43 | const JID& ownFullJID, | 43 | const JID& ownJID, |
| 44 | JingleSessionManager* jingleSessionManager, | 44 | JingleSessionManager* jingleSessionManager, |
| 45 | IQRouter* router, | 45 | IQRouter* router, |
| 46 | EntityCapsProvider* capsProvider, | 46 | EntityCapsProvider* capsProvider, |
| 47 | PresenceOracle* presOracle, | 47 | PresenceOracle* presOracle, |
| 48 | ConnectionFactory* connectionFactory, | 48 | ConnectionFactory* connectionFactory, |
| @@ -50,20 +50,17 @@ FileTransferManagerImpl::FileTransferManagerImpl( | |||
| 50 | TimerFactory* timerFactory, | 50 | TimerFactory* timerFactory, |
| 51 | DomainNameResolver* domainNameResolver, | 51 | DomainNameResolver* domainNameResolver, |
| 52 | NetworkEnvironment* networkEnvironment, | 52 | NetworkEnvironment* networkEnvironment, |
| 53 | NATTraverser* natTraverser, | 53 | NATTraverser* natTraverser, |
| 54 | CryptoProvider* crypto) : | 54 | CryptoProvider* crypto) : |
| 55 | ownJID(ownFullJID), | ||
| 56 | iqRouter(router), | 55 | iqRouter(router), |
| 57 | capsProvider(capsProvider), | 56 | capsProvider(capsProvider), |
| 58 | presenceOracle(presOracle) { | 57 | presenceOracle(presOracle) { |
| 59 | assert(!ownFullJID.isBare()); | ||
| 60 | |||
| 61 | bytestreamRegistry = new SOCKS5BytestreamRegistry(); | 58 | bytestreamRegistry = new SOCKS5BytestreamRegistry(); |
| 62 | s5bServerManager = new SOCKS5BytestreamServerManager( | 59 | s5bServerManager = new SOCKS5BytestreamServerManager( |
| 63 | bytestreamRegistry, connectionServerFactory, networkEnvironment, natTraverser); | 60 | bytestreamRegistry, connectionServerFactory, networkEnvironment, natTraverser); |
| 64 | bytestreamProxy = new SOCKS5BytestreamProxiesManager(connectionFactory, timerFactory, domainNameResolver, iqRouter, JID(ownFullJID.getDomain())); | 61 | bytestreamProxy = new SOCKS5BytestreamProxiesManager(connectionFactory, timerFactory, domainNameResolver, iqRouter, JID(ownJID.getDomain())); |
| 65 | 62 | ||
| 66 | transporterFactory = new DefaultFileTransferTransporterFactory( | 63 | transporterFactory = new DefaultFileTransferTransporterFactory( |
| 67 | bytestreamRegistry, | 64 | bytestreamRegistry, |
| 68 | s5bServerManager, | 65 | s5bServerManager, |
| 69 | bytestreamProxy, | 66 | bytestreamProxy, |
| @@ -164,10 +161,12 @@ OutgoingFileTransfer::ref FileTransferManagerImpl::createOutgoingFileTransfer( | |||
| 164 | receipient = fullJID.get(); | 161 | receipient = fullJID.get(); |
| 165 | } else { | 162 | } else { |
| 166 | return OutgoingFileTransfer::ref(); | 163 | return OutgoingFileTransfer::ref(); |
| 167 | } | 164 | } |
| 168 | } | 165 | } |
| 169 | 166 | ||
| 170 | return outgoingFTManager->createOutgoingFileTransfer(ownJID, receipient, bytestream, fileInfo, config); | 167 | assert(!iqRouter->getJID().isBare()); |
| 168 | |||
| 169 | return outgoingFTManager->createOutgoingFileTransfer(iqRouter->getJID(), receipient, bytestream, fileInfo, config); | ||
| 171 | } | 170 | } |
| 172 | 171 | ||
| 173 | } | 172 | } |
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 | |||
| @@ -10,37 +10,37 @@ | |||
| 10 | * See the COPYING file for more information. | 10 | * See the COPYING file for more information. |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #pragma once | 13 | #pragma once |
| 14 | 14 | ||
| 15 | #include <vector> | ||
| 16 | #include <string> | 15 | #include <string> |
| 16 | #include <vector> | ||
| 17 | 17 | ||
| 18 | #include <boost/filesystem/path.hpp> | ||
| 19 | #include <boost/date_time/posix_time/posix_time.hpp> | 18 | #include <boost/date_time/posix_time/posix_time.hpp> |
| 19 | #include <boost/filesystem/path.hpp> | ||
| 20 | #include <boost/optional.hpp> | 20 | #include <boost/optional.hpp> |
| 21 | 21 | ||
| 22 | #include <Swiften/Base/API.h> | 22 | #include <Swiften/Base/API.h> |
| 23 | #include <Swiften/Base/IDGenerator.h> | ||
| 23 | #include <Swiften/Base/Override.h> | 24 | #include <Swiften/Base/Override.h> |
| 25 | #include <Swiften/Base/boost_bsignals.h> | ||
| 26 | #include <Swiften/Elements/S5BProxyRequest.h> | ||
| 24 | #include <Swiften/FileTransfer/FileTransferManager.h> | 27 | #include <Swiften/FileTransfer/FileTransferManager.h> |
| 25 | #include <Swiften/FileTransfer/FileTransferOptions.h> | 28 | #include <Swiften/FileTransfer/FileTransferOptions.h> |
| 26 | #include <Swiften/Base/boost_bsignals.h> | ||
| 27 | #include <Swiften/Base/IDGenerator.h> | ||
| 28 | #include <Swiften/JID/JID.h> | ||
| 29 | #include <Swiften/FileTransfer/OutgoingFileTransfer.h> | ||
| 30 | #include <Swiften/FileTransfer/IncomingFileTransfer.h> | 29 | #include <Swiften/FileTransfer/IncomingFileTransfer.h> |
| 31 | #include <Swiften/Elements/S5BProxyRequest.h> | 30 | #include <Swiften/FileTransfer/OutgoingFileTransfer.h> |
| 32 | 31 | ||
| 33 | namespace Swift { | 32 | namespace Swift { |
| 34 | class ConnectionFactory; | 33 | class ConnectionFactory; |
| 35 | class ConnectionServerFactory; | 34 | class ConnectionServerFactory; |
| 36 | class CryptoProvider; | 35 | class CryptoProvider; |
| 37 | class DomainNameResolver; | 36 | class DomainNameResolver; |
| 38 | class EntityCapsProvider; | 37 | class EntityCapsProvider; |
| 39 | class FileTransferTransporterFactory; | 38 | class FileTransferTransporterFactory; |
| 40 | class IQRouter; | 39 | class IQRouter; |
| 41 | class IncomingFileTransferManager; | 40 | class IncomingFileTransferManager; |
| 41 | class JID; | ||
| 42 | class JingleSessionManager; | 42 | class JingleSessionManager; |
| 43 | class NATTraverser; | 43 | class NATTraverser; |
| 44 | class NetworkEnvironment; | 44 | class NetworkEnvironment; |
| 45 | class OutgoingFileTransferManager; | 45 | class OutgoingFileTransferManager; |
| 46 | class PresenceOracle; | 46 | class PresenceOracle; |
| @@ -87,12 +87,10 @@ namespace Swift { | |||
| 87 | 87 | ||
| 88 | private: | 88 | private: |
| 89 | boost::optional<JID> highestPriorityJIDSupportingFileTransfer(const JID& bareJID); | 89 | boost::optional<JID> highestPriorityJIDSupportingFileTransfer(const JID& bareJID); |
| 90 | 90 | ||
| 91 | private: | 91 | private: |
| 92 | JID ownJID; | ||
| 93 | |||
| 94 | OutgoingFileTransferManager* outgoingFTManager; | 92 | OutgoingFileTransferManager* outgoingFTManager; |
| 95 | IncomingFileTransferManager* incomingFTManager; | 93 | IncomingFileTransferManager* incomingFTManager; |
| 96 | FileTransferTransporterFactory* transporterFactory; | 94 | FileTransferTransporterFactory* transporterFactory; |
| 97 | IQRouter* iqRouter; | 95 | IQRouter* iqRouter; |
| 98 | EntityCapsProvider* capsProvider; | 96 | EntityCapsProvider* capsProvider; |
Swift