hrev53853 adds 1 changeset to branch 'master'
old head: 3a63d1efff9b6fcc5423d11a2b029d59c15acd0f
new head: 0e280da525d18b9ca2da5e36f16b6b29993a6d75
overview:
https://git.haiku-os.org/haiku/log/?qt=range&q=0e280da525d1+%5E3a63d1efff9b
----------------------------------------------------------------------------
0e280da525d1: SecureSocket: fix non-blocking reads
OpenSSL says we should retry when a non-blocking read finds no data is
pending. But in that case we should not retry immediately, because the
operation should be non-blocking.
[ Adrien Destugues <pulkomandy@xxxxxxxxxxxxx> ]
----------------------------------------------------------------------------
Revision: hrev53853
Commit: 0e280da525d18b9ca2da5e36f16b6b29993a6d75
URL: https://git.haiku-os.org/haiku/commit/?id=0e280da525d1
Author: Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
Date: Sat Feb 8 20:59:47 2020 UTC
----------------------------------------------------------------------------
1 file changed, 6 insertions(+)
src/kits/network/libnetapi/SecureSocket.cpp | 6 ++++++
----------------------------------------------------------------------------
diff --git a/src/kits/network/libnetapi/SecureSocket.cpp
b/src/kits/network/libnetapi/SecureSocket.cpp
index c2c3dc7618..fdd77311ca 100644
--- a/src/kits/network/libnetapi/SecureSocket.cpp
+++ b/src/kits/network/libnetapi/SecureSocket.cpp
@@ -551,6 +551,12 @@ BSecureSocket::Read(void* buffer, size_t size)
bytesRead = SSL_read(fPrivate->fSSL, buffer, size);
if (bytesRead >= 0)
return bytesRead;
+ // Don't retry in cases of "no data available" for non-blocking
sockets
+ int error = SSL_get_error(fPrivate->fSSL, bytesRead);
+ if (error == SSL_ERROR_WANT_READ || error ==
SSL_ERROR_WANT_WRITE)
+ return B_WOULD_BLOCK;
+ // Otherwise, check if we should retry (maybe we were
interrupted by
+ // a signal, for example)
retry = BIO_should_retry(SSL_get_rbio(fPrivate->fSSL));
} while(retry != 0);