mirror of
https://github.com/Icinga/icinga2.git
synced 2025-07-24 06:05:01 +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,7 +189,46 @@ 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);
|
||||||
|
|
||||||
|
switch (err) {
|
||||||
|
case SSL_ERROR_WANT_READ:
|
||||||
|
m_Retry = true;
|
||||||
|
ChangeEvents(POLLIN);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SSL_ERROR_WANT_WRITE:
|
||||||
|
m_Retry = true;
|
||||||
|
ChangeEvents(POLLOUT);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case SSL_ERROR_ZERO_RETURN:
|
||||||
|
lock.unlock();
|
||||||
|
|
||||||
|
Close();
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
m_ErrorCode = ERR_peek_error();
|
||||||
|
m_ErrorOccurred = true;
|
||||||
|
|
||||||
|
if (m_ErrorCode != 0) {
|
||||||
|
Log(LogWarning, "TlsStream")
|
||||||
|
<< "OpenSSL error: " << ERR_error_string(m_ErrorCode, NULL);
|
||||||
|
} else {
|
||||||
|
Log(LogWarning, "TlsStream", "TLS stream was disconnected.");
|
||||||
|
}
|
||||||
|
|
||||||
|
lock.unlock();
|
||||||
|
|
||||||
|
Close();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (success) {
|
||||||
m_CurrentAction = TlsActionNone;
|
m_CurrentAction = TlsActionNone;
|
||||||
|
|
||||||
if (!m_Eof) {
|
if (!m_Eof) {
|
||||||
@ -198,51 +245,6 @@ void TlsStream::OnEvent(int revents)
|
|||||||
|
|
||||||
if (m_Shutdown && !m_SendQ->IsDataAvailable())
|
if (m_Shutdown && !m_SendQ->IsDataAvailable())
|
||||||
Close();
|
Close();
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = SSL_get_error(m_SSL.get(), rc);
|
|
||||||
|
|
||||||
switch (err) {
|
|
||||||
case SSL_ERROR_WANT_READ:
|
|
||||||
m_Retry = true;
|
|
||||||
ChangeEvents(POLLIN);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case SSL_ERROR_WANT_WRITE:
|
|
||||||
m_Retry = true;
|
|
||||||
ChangeEvents(POLLOUT);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case SSL_ERROR_ZERO_RETURN:
|
|
||||||
lock.unlock();
|
|
||||||
|
|
||||||
if (IsHandlingEvents())
|
|
||||||
SignalDataAvailable();
|
|
||||||
|
|
||||||
Close();
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
m_ErrorCode = ERR_peek_error();
|
|
||||||
m_ErrorOccurred = true;
|
|
||||||
|
|
||||||
if (m_ErrorCode != 0) {
|
|
||||||
Log(LogWarning, "TlsStream")
|
|
||||||
<< "OpenSSL error: " << ERR_error_string(m_ErrorCode, NULL);
|
|
||||||
} else {
|
|
||||||
Log(LogWarning, "TlsStream", "TLS stream was disconnected.");
|
|
||||||
}
|
|
||||||
|
|
||||||
lock.unlock();
|
|
||||||
|
|
||||||
if (IsHandlingEvents())
|
|
||||||
SignalDataAvailable();
|
|
||||||
|
|
||||||
Close();
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user