From a7aba08f7fd2700c92fd9661eee212755ba8795e Mon Sep 17 00:00:00 2001
From: Kumar Kaushik <kaushikk@vmware.com>
Date: Thu, 7 Dec 2017 12:53:17 -0800
Subject: [PATCH] Fixing tls: unexpected message ERROR

Change-Id: I63dce89d4dcfa445b6594d4b776ef8827f1498ff
(cherry picked from commit 424f6d0f3435eccad781d39ef0c656a00395dc46)
---
 transport/posix/socket.c | 34 +++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 11 deletions(-)

diff --git a/transport/posix/socket.c b/transport/posix/socket.c
index d3a3dbc..18cef89 100644
--- a/transport/posix/socket.c
+++ b/transport/posix/socket.c
@@ -576,7 +576,6 @@ VmSockPosixWaitForEvent(
                                    FALSE
                                    );
                     BAIL_ON_VMREST_ERROR(dwError);
-                
                 }
 
                 dwError = VmSockPosixEventQueueAdd_inlock(
@@ -895,7 +894,7 @@ VmSockPosixRead(
         }
         else
         {
-            VMREST_LOG_ERROR(pRESTHandle,"%s","Unknown socket read error: errno %u, errorCode %u, nRead %d", errno, errorCode, nRead);
+            VMREST_LOG_ERROR(pRESTHandle,"Unknown socket read error: errno %u, errorCode %u, nRead %d", errno, errorCode, nRead);
             dwError = REST_ENGINE_FAILURE;
         }
     }
@@ -1007,6 +1006,9 @@ VmSockPosixWrite(
 
     while(nWrittenTotal < nBufLen )
     {
+         nWritten = 0;
+         errorCode = 0;
+         errno = 0;
          if (pRESTHandle->pSSLInfo->isSecure && (pSocket->ssl != NULL))
          {
              nWritten = SSL_write(pSocket->ssl,(pszBuffer + nWrittenTotal),nRemaining);
@@ -1030,7 +1032,7 @@ VmSockPosixWrite(
          }
          else
          {
-             if (errorCode == EAGAIN || errorCode == EWOULDBLOCK || errorCode == SSL_ERROR_WANT_WRITE)
+             if ((nWritten < 0) && (errorCode == EAGAIN || errorCode == EWOULDBLOCK || errorCode == SSL_ERROR_WANT_WRITE))
              {
                  if (timeOutSec >= 0)
                  {
@@ -1101,6 +1103,8 @@ VmSockPosixCloseSocket(
     )
 {
     DWORD                            dwError = REST_ENGINE_SUCCESS;
+    int                              ret = 0;
+    uint32_t                         errorCode = 0;
     BOOLEAN                          bLocked = FALSE;
 
     if (!pRESTHandle || !pSocket )
@@ -1121,18 +1125,24 @@ VmSockPosixCloseSocket(
         pSocket->pTimerSocket->fd = -1;
     }
 
+    if (pRESTHandle->pSSLInfo->isSecure && pSocket->ssl)
+    {
+        ret = SSL_shutdown(pSocket->ssl);
+        if (ret < 0)
+        {
+            errorCode = SSL_get_error(pSocket->ssl, ret);
+            VMREST_LOG_ERROR(pRESTHandle,"Error on SSL_shutdown on socket %d, return value %d, errorCode %u", pSocket->fd, ret, errorCode);
+        }
+        SSL_free(pSocket->ssl);
+        pSocket->ssl = NULL;
+    }
+
     if (pSocket->fd >= 0)
     {
         close(pSocket->fd);
         pSocket->fd = -1;
     }
 
-    if (pRESTHandle->pSSLInfo->isSecure && pSocket->ssl)
-    {
-        SSL_shutdown(pSocket->ssl);
-        SSL_free(pSocket->ssl);
-        pSocket->ssl = NULL;
-    }
 
 cleanup:
 
@@ -1742,6 +1752,7 @@ VmSockPosixIsSafeToCloseConnOnTimeOut(
     BAIL_ON_VMREST_ERROR(dwError);
 
     pSocket = pTimerSocket->pIoSocket;
+    errno = 0;
 
     if ((pRESTHandle->pSSLInfo->isSecure) && (pSocket->ssl))
     {
@@ -1771,6 +1782,7 @@ VmSockPosixIsSafeToCloseConnOnTimeOut(
             do
             {
                 errorCode = 0;
+                errno = 0;
                 nRead = 0;
                 nRead = read(pTimerSocket->fd, &res, sizeof(res));
                 errorCode = errno;
@@ -1918,13 +1930,13 @@ VmRESTAcceptSSLContext(
     }
     else if ((ret == -1) && ((errorCode == SSL_ERROR_WANT_READ) || (errorCode == SSL_ERROR_WANT_WRITE)))
     {
-       VMREST_LOG_DEBUG(pRESTHandle,"SSL handshake not completed for socket %d", pSocket->fd);
+       VMREST_LOG_DEBUG(pRESTHandle," SSL handshake not completed for socket %d, ret %d, errorCode %u", pSocket->fd, ret, errorCode);
        pSocket->bSSLHandShakeCompleted = FALSE;
        bReArm = TRUE;
     }
     else
     {
-        VMREST_LOG_ERROR(pRESTHandle, "SSL handshake failed...connection will be closed for socket with fd %d", pSocket->fd);
+        VMREST_LOG_ERROR(pRESTHandle, "SSL handshake failed...connection will be closed for socket with fd %d, ret %d, errorCode %u", pSocket->fd, ret, errorCode);
         dwError = VMREST_TRANSPORT_SSL_ACCEPT_FAILED;
         BAIL_ON_VMREST_ERROR(dwError);
     }