Fix memory leak for JSON-RPC/HTTP connections

fixes #10517
This commit is contained in:
Gunnar Beutner 2015-11-08 21:23:04 +01:00
parent 4bb9beda19
commit 5a74f69819
6 changed files with 33 additions and 22 deletions

View File

@ -36,7 +36,7 @@ class I2_BASE_API FIFO : public Stream
public:
DECLARE_PTR_TYPEDEFS(FIFO);
static const size_t BlockSize = 16 * 1024;
static const size_t BlockSize = 512;
FIFO(void);
~FIFO(void);

View File

@ -27,6 +27,8 @@ NetworkStream::NetworkStream(const Socket::Ptr& socket)
void NetworkStream::Close(void)
{
Stream::Close();
m_Socket->Close();
}

View File

@ -55,6 +55,8 @@ void StdioStream::Write(const void *buffer, size_t size)
void StdioStream::Close(void)
{
Stream::Close();
if (m_OwnsStream) {
delete m_InnerStream;
m_OwnsStream = false;

View File

@ -76,6 +76,11 @@ bool Stream::WaitForData(int timeout)
return IsDataAvailable() || IsEof();
}
void Stream::Close(void)
{
OnDataAvailable.disconnect_all_slots();
}
StreamReadStatus Stream::ReadLine(String *line, StreamReadContext& context, bool may_wait)
{
if (context.Eof)

View File

@ -113,7 +113,7 @@ public:
/**
* Closes the stream and releases resources.
*/
virtual void Close(void) = 0;
virtual void Close(void);
/**
* Checks whether we've reached the end-of-file condition.

View File

@ -85,7 +85,7 @@ TlsStream::TlsStream(const Socket::Ptr& socket, const String& hostname, Connecti
TlsStream::~TlsStream(void)
{
SocketEvents::Unregister();
Close();
}
int TlsStream::ValidateCertificate(int preverify_ok, X509_STORE_CTX *ctx)
@ -216,33 +216,31 @@ void TlsStream::OnEvent(int revents)
break;
case SSL_ERROR_ZERO_RETURN:
SocketEvents::Unregister();
lock.unlock();
m_SSL.reset();
m_Socket->Close();
m_Socket.reset();
if (IsHandlingEvents())
SignalDataAvailable();
m_Eof = true;
m_CV.notify_all();
Close();
break;
default:
SocketEvents::Unregister();
m_SSL.reset();
m_Socket->Close();
m_Socket.reset();
m_Eof = true;
m_ErrorCode = ERR_peek_error();
m_ErrorOccurred = true;
Log(LogWarning, "TlsStream")
<< "OpenSSL error: " << ERR_error_string(m_ErrorCode, NULL);
if (m_ErrorCode != 0) {
Log(LogWarning, "TlsStream")
<< "OpenSSL error: " << ERR_error_string(m_ErrorCode, NULL);
} else {
Log(LogWarning, "TlsStream", "TLS stream was disconnected.");
}
m_CV.notify_all();
lock.unlock();
if (IsHandlingEvents())
SignalDataAvailable();
Close();
break;
}
@ -318,6 +316,8 @@ void TlsStream::Shutdown(void)
*/
void TlsStream::Close(void)
{
Stream::Close();
SocketEvents::Unregister();
boost::mutex::scoped_lock lock(m_Mutex);
@ -327,11 +327,13 @@ void TlsStream::Close(void)
if (!m_SSL)
return;
(void) SSL_shutdown(m_SSL.get());
(void)SSL_shutdown(m_SSL.get());
m_SSL.reset();
m_Socket->Close();
m_Socket.reset();
m_CV.notify_all();
}
bool TlsStream::IsEof(void) const