From 56a9cd8b7f8b626d57c6fa613d799a336c3655b1 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 11 Apr 2012 23:00:54 +0000 Subject: Fix a memory leak when TcpNice is disabled. --- bin/bbackupd/BackupClientContext.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'bin/bbackupd/BackupClientContext.cpp') diff --git a/bin/bbackupd/BackupClientContext.cpp b/bin/bbackupd/BackupClientContext.cpp index e1c4349f..20189fad 100644 --- a/bin/bbackupd/BackupClientContext.cpp +++ b/bin/bbackupd/BackupClientContext.cpp @@ -115,8 +115,9 @@ BackupProtocolClient &BackupClientContext::GetConnection() // there shouldn't be a connection open ASSERT(mapSocket.get() == 0); - - SocketStreamTLS *pSocket = new SocketStreamTLS; + // Defensive. Must close connection before releasing any old socket. + mapConnection.reset(); + mapSocket.reset(new SocketStreamTLS); try { @@ -128,20 +129,21 @@ BackupProtocolClient &BackupClientContext::GetConnection() mHostname << "'..."); // Connect! - pSocket->Open(mrTLSContext, Socket::TypeINET, mHostname.c_str(), mPort); + ((SocketStreamTLS *)(mapSocket.get()))->Open(mrTLSContext, + Socket::TypeINET, mHostname, mPort); if(mTcpNiceMode) { - mapNice.reset(new NiceSocketStream(std::auto_ptr(pSocket))); + // Pass control of mapSocket to NiceSocketStream, + // which will take care of destroying it for us. + mapNice.reset(new NiceSocketStream(mapSocket)); mapConnection.reset(new BackupProtocolClient(*mapNice)); } else { - mapConnection.reset(new BackupProtocolClient(*pSocket)); + mapConnection.reset(new BackupProtocolClient(*mapSocket)); } - pSocket = NULL; - // Set logging option mapConnection->SetLogToSysLog(mExtendedLogging); @@ -189,8 +191,8 @@ BackupProtocolClient &BackupClientContext::GetConnection() try { mapConnection->QueryFinished(); - mapSocket.reset(); mapNice.reset(); + mapSocket.reset(); } catch(...) { @@ -219,8 +221,8 @@ BackupProtocolClient &BackupClientContext::GetConnection() { // Clean up. mapConnection.reset(); - mapSocket.reset(); mapNice.reset(); + mapSocket.reset(); throw; } @@ -269,8 +271,8 @@ void BackupClientContext::CloseAnyOpenConnection() try { // Be nice about closing the socket - mapSocket.reset(); mapNice.reset(); + mapSocket.reset(); } catch(...) { -- cgit v1.2.3