Fix memory/thread leak in the HttpServerConnection class

fixes #10655
This commit is contained in:
Gunnar Beutner 2016-02-03 09:54:31 +01:00
parent b6a799d53e
commit 9a0107d360
2 changed files with 23 additions and 8 deletions

View File

@ -189,7 +189,7 @@ void TlsStream::OnEvent(int revents)
VERIFY(!"Invalid TlsAction"); VERIFY(!"Invalid TlsAction");
} }
if (rc < 0) { if (rc <= 0) {
int err = SSL_get_error(m_SSL.get(), rc); int err = SSL_get_error(m_SSL.get(), rc);
switch (err) { switch (err) {
@ -208,7 +208,7 @@ void TlsStream::OnEvent(int revents)
Close(); Close();
break; return;
default: default:
m_ErrorCode = ERR_peek_error(); m_ErrorCode = ERR_peek_error();
m_ErrorOccurred = true; m_ErrorOccurred = true;
@ -224,7 +224,7 @@ void TlsStream::OnEvent(int revents)
Close(); Close();
break; return;
} }
} }
@ -242,9 +242,11 @@ void TlsStream::OnEvent(int revents)
while (m_RecvQ->IsDataAvailable() && IsHandlingEvents()) while (m_RecvQ->IsDataAvailable() && IsHandlingEvents())
SignalDataAvailable(); SignalDataAvailable();
}
if (m_Shutdown && !m_SendQ->IsDataAvailable()) if (m_Shutdown && !m_SendQ->IsDataAvailable()) {
Close(); lock.unlock();
Close();
} }
} }
@ -311,6 +313,7 @@ void TlsStream::Write(const void *buffer, size_t count)
void TlsStream::Shutdown(void) void TlsStream::Shutdown(void)
{ {
m_Shutdown = true; m_Shutdown = true;
ChangeEvents(POLLOUT);
} }
/** /**
@ -318,10 +321,23 @@ void TlsStream::Shutdown(void)
*/ */
void TlsStream::Close(void) void TlsStream::Close(void)
{ {
<<<<<<< HEAD
if (!m_Eof) { if (!m_Eof) {
m_Eof = true; m_Eof = true;
=======
CloseInternal(false);
}
void TlsStream::CloseInternal(bool inDestructor)
{
if (m_Eof)
return;
m_Eof = true;
if (!inDestructor)
>>>>>>> 2dc385e... Fix memory/thread leak in the HttpServerConnection class
SignalDataAvailable(); SignalDataAvailable();
}
Stream::Close(); Stream::Close();

View File

@ -78,8 +78,7 @@ void HttpServerConnection::Disconnect(void)
ApiListener::Ptr listener = ApiListener::GetInstance(); ApiListener::Ptr listener = ApiListener::GetInstance();
listener->RemoveHttpClient(this); listener->RemoveHttpClient(this);
if (!m_Stream->IsEof()) m_Stream->Shutdown();
m_Stream->Shutdown();
} }
bool HttpServerConnection::ProcessMessage(void) bool HttpServerConnection::ProcessMessage(void)