From 586a8932014d08d72ddc4692007a39196ec870b5 Mon Sep 17 00:00:00 2001 From: XinyuHou Date: Fri, 17 Apr 2015 14:01:35 +0100 Subject: [PATCH] Made retry secure write/read use the exactly last parameters #4539 --- src/lib/net/TCPSocket.cpp | 14 +++++++++++++- src/lib/plugin/ns/SecureSocket.cpp | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/lib/net/TCPSocket.cpp b/src/lib/net/TCPSocket.cpp index c54df40b..62175664 100644 --- a/src/lib/net/TCPSocket.cpp +++ b/src/lib/net/TCPSocket.cpp @@ -461,15 +461,26 @@ TCPSocket::serviceConnected(ISocketMultiplexerJob* job, } bool needNewJob = false; + static UInt32 s_retryOutputBufferSize = 0; if (write) { try { // write data UInt32 n = m_outputBuffer.getSize(); + + if (s_retryOutputBufferSize > 0) { + n = s_retryOutputBufferSize; + } + const void* buffer = m_outputBuffer.peek(n); if (isSecure()) { if (isSecureReady()) { + s_retryOutputBufferSize = n; n = secureWrite(buffer, n); + + if (n > 0) { + s_retryOutputBufferSize = 0; + } } else { return job; @@ -519,7 +530,8 @@ TCPSocket::serviceConnected(ISocketMultiplexerJob* job, if (read && m_readable) { try { - UInt8 buffer[4096]; + static UInt8 buffer[4096]; + memset(buffer, 0, sizeof(buffer)); size_t n = 0; if (isSecure()) { diff --git a/src/lib/plugin/ns/SecureSocket.cpp b/src/lib/plugin/ns/SecureSocket.cpp index 5b1544db..c878871d 100644 --- a/src/lib/plugin/ns/SecureSocket.cpp +++ b/src/lib/plugin/ns/SecureSocket.cpp @@ -370,6 +370,21 @@ SecureSocket::checkResult(int n, bool& fatal, bool& retry) case SSL_ERROR_SYSCALL: LOG((CLOG_ERR "secure socket error: SSL_ERROR_SYSCALL")); + if (ERR_peek_error() == 0) { + if (n == 0) { + LOG((CLOG_ERR "an EOF violates the protocol")); + } + else if (n == -1) { + // underlying socket I/O reproted an error + try { + ARCH->throwErrorOnSocket(getSocket()); + } + catch (XArchNetwork& e) { + LOG((CLOG_ERR "%s", e.what())); + } + } + } + fatal = true; break;