summaryrefslogtreecommitdiff
path: root/cpp/src/IceSSL/OpenSSLTransceiverI.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2019-08-22 16:11:32 +0200
committerBenoit Foucher <benoit@zeroc.com>2019-08-22 16:11:32 +0200
commite27df63b4c9415c1cc78b526d3b40d60a80fe3d6 (patch)
tree1ad4a9cf8f62e335d931bc1500a6cd395fd7d16e /cpp/src/IceSSL/OpenSSLTransceiverI.cpp
parentJava logger uses Ice.ProgramName for prefix now. Fixes #488 (diff)
downloadice-e27df63b4c9415c1cc78b526d3b40d60a80fe3d6.tar.bz2
ice-e27df63b4c9415c1cc78b526d3b40d60a80fe3d6.tar.xz
ice-e27df63b4c9415c1cc78b526d3b40d60a80fe3d6.zip
Workaround for AIX issue with SSL_write and EWOULDBLOCK
Diffstat (limited to 'cpp/src/IceSSL/OpenSSLTransceiverI.cpp')
-rw-r--r--cpp/src/IceSSL/OpenSSLTransceiverI.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/cpp/src/IceSSL/OpenSSLTransceiverI.cpp b/cpp/src/IceSSL/OpenSSLTransceiverI.cpp
index d33bb6aaf52..2050f304a0f 100644
--- a/cpp/src/IceSSL/OpenSSLTransceiverI.cpp
+++ b/cpp/src/IceSSL/OpenSSLTransceiverI.cpp
@@ -443,6 +443,21 @@ OpenSSL::TransceiverI::write(IceInternal::Buffer& buf)
if(ret <= 0)
{
+#if defined(_AIX)
+ //
+ // WORKAROUND: OpenSSL SSL_write on AIX sometime ends up reporting a error
+ // with SSL_get_error but there's no error in the error queue. This occurs
+ // when SSL_write can't write more data. So we just return SocketOperationWrite
+ // in this case.
+ //
+ if(SSL_get_error(_ssl, ret) == SSL_ERROR_SSL && ERR_peek_error() == 0)
+ {
+ if(SSL_want_write(_ssl))
+ {
+ return IceInternal::SocketOperationWrite;
+ }
+ }
+#endif
switch(SSL_get_error(_ssl, ret))
{
case SSL_ERROR_NONE: