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
@@ -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
84Client::~Client() { 101Client::~Client() {
85 delete pubsubManager; 102 delete pubsubManager;
86 delete whiteboardSessionManager; 103 delete whiteboardSessionManager;
@@ -124,28 +141,10 @@ XMPPRoster* Client::getRoster() const {
124void Client::setSoftwareVersion(const std::string& name, const std::string& version, const std::string& os) { 141void 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
128void Client::handleConnected() { 145void 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
150void Client::requestRoster() { 149void 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
40namespace Swift { 40namespace Swift {
41 41
42FileTransferManagerImpl::FileTransferManagerImpl( 42FileTransferManagerImpl::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
33namespace Swift { 32namespace 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;