mirror of
https://github.com/Icinga/icinga2.git
synced 2025-07-25 14:44:32 +02:00
parent
3b4fc69fab
commit
a2cbe1a0d5
@ -126,7 +126,7 @@ boost::shared_ptr<X509> TlsStream::GetPeerCertificate(void) const
|
|||||||
|
|
||||||
void TlsStream::OnEvent(int revents)
|
void TlsStream::OnEvent(int revents)
|
||||||
{
|
{
|
||||||
int rc, err;
|
int rc;
|
||||||
size_t count;
|
size_t count;
|
||||||
|
|
||||||
boost::mutex::scoped_lock lock(m_Mutex);
|
boost::mutex::scoped_lock lock(m_Mutex);
|
||||||
@ -147,6 +147,8 @@ void TlsStream::OnEvent(int revents)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
switch (m_CurrentAction) {
|
switch (m_CurrentAction) {
|
||||||
case TlsActionRead:
|
case TlsActionRead:
|
||||||
do {
|
do {
|
||||||
@ -154,9 +156,12 @@ void TlsStream::OnEvent(int revents)
|
|||||||
|
|
||||||
if (rc > 0) {
|
if (rc > 0) {
|
||||||
m_RecvQ->Write(buffer, rc);
|
m_RecvQ->Write(buffer, rc);
|
||||||
m_CV.notify_all();
|
success = true;
|
||||||
}
|
}
|
||||||
} while (SSL_pending(m_SSL.get()));
|
} while (rc > 0);
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
m_CV.notify_all();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case TlsActionWrite:
|
case TlsActionWrite:
|
||||||
@ -164,14 +169,17 @@ void TlsStream::OnEvent(int revents)
|
|||||||
|
|
||||||
rc = SSL_write(m_SSL.get(), buffer, count);
|
rc = SSL_write(m_SSL.get(), buffer, count);
|
||||||
|
|
||||||
if (rc > 0)
|
if (rc > 0) {
|
||||||
m_SendQ->Read(NULL, rc, true);
|
m_SendQ->Read(NULL, rc, true);
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case TlsActionHandshake:
|
case TlsActionHandshake:
|
||||||
rc = SSL_do_handshake(m_SSL.get());
|
rc = SSL_do_handshake(m_SSL.get());
|
||||||
|
|
||||||
if (rc > 0) {
|
if (rc > 0) {
|
||||||
|
success = true;
|
||||||
m_HandshakeOK = true;
|
m_HandshakeOK = true;
|
||||||
m_CV.notify_all();
|
m_CV.notify_all();
|
||||||
}
|
}
|
||||||
@ -181,28 +189,8 @@ void TlsStream::OnEvent(int revents)
|
|||||||
VERIFY(!"Invalid TlsAction");
|
VERIFY(!"Invalid TlsAction");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc > 0) {
|
if (rc < 0) {
|
||||||
m_CurrentAction = TlsActionNone;
|
int err = SSL_get_error(m_SSL.get(), rc);
|
||||||
|
|
||||||
if (!m_Eof) {
|
|
||||||
if (m_SendQ->GetAvailableBytes() > 0)
|
|
||||||
ChangeEvents(POLLIN|POLLOUT);
|
|
||||||
else
|
|
||||||
ChangeEvents(POLLIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
lock.unlock();
|
|
||||||
|
|
||||||
while (m_RecvQ->IsDataAvailable() && IsHandlingEvents())
|
|
||||||
SignalDataAvailable();
|
|
||||||
|
|
||||||
if (m_Shutdown && !m_SendQ->IsDataAvailable())
|
|
||||||
Close();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = SSL_get_error(m_SSL.get(), rc);
|
|
||||||
|
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case SSL_ERROR_WANT_READ:
|
case SSL_ERROR_WANT_READ:
|
||||||
@ -218,9 +206,6 @@ void TlsStream::OnEvent(int revents)
|
|||||||
case SSL_ERROR_ZERO_RETURN:
|
case SSL_ERROR_ZERO_RETURN:
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
|
|
||||||
if (IsHandlingEvents())
|
|
||||||
SignalDataAvailable();
|
|
||||||
|
|
||||||
Close();
|
Close();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -237,13 +222,30 @@ void TlsStream::OnEvent(int revents)
|
|||||||
|
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
|
|
||||||
if (IsHandlingEvents())
|
|
||||||
SignalDataAvailable();
|
|
||||||
|
|
||||||
Close();
|
Close();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
m_CurrentAction = TlsActionNone;
|
||||||
|
|
||||||
|
if (!m_Eof) {
|
||||||
|
if (m_SendQ->GetAvailableBytes() > 0)
|
||||||
|
ChangeEvents(POLLIN|POLLOUT);
|
||||||
|
else
|
||||||
|
ChangeEvents(POLLIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
lock.unlock();
|
||||||
|
|
||||||
|
while (m_RecvQ->IsDataAvailable() && IsHandlingEvents())
|
||||||
|
SignalDataAvailable();
|
||||||
|
|
||||||
|
if (m_Shutdown && !m_SendQ->IsDataAvailable())
|
||||||
|
Close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TlsStream::HandleError(void) const
|
void TlsStream::HandleError(void) const
|
||||||
|
Loading…
x
Reference in New Issue
Block a user