SPECS/c-rest-engine/fd_leak.patch
37ae628c
 From 71654c6fbe669c98c6c8a27cd425713eb916642a Mon Sep 17 00:00:00 2001
 From: Kumar Kaushik <kaushikk@vmware.com>
 Date: Wed, 9 May 2018 12:27:33 -0700
 Subject: [PATCH] Fixing file descriptor leak in case of SSL_accept failure
 
 Change-Id: If5632e67da7843d7aa7ac48f1363dc58bbea2acb
 ---
  transport/posix/socket.c | 43 ++++++++++++++++++++++++-------------------
  1 file changed, 24 insertions(+), 19 deletions(-)
 
 diff --git a/transport/posix/socket.c b/transport/posix/socket.c
 index f50356d..364ce0e 100644
 --- a/transport/posix/socket.c
 +++ b/transport/posix/socket.c
 @@ -1160,8 +1160,6 @@ VmSockPosixCloseSocket(
      }
      BAIL_ON_VMREST_ERROR(dwError);
  
 -    VMREST_LOG_INFO(pRESTHandle,"C-REST-ENGINE: Closing socket with fd %d, Socket Type %u ( 2-Io / 5-Timer )", pSocket->fd, pSocket->type);
 -
      pTimerSocket = pSocket->pTimerSocket;
  
      /**** Close the timer socket ****/
 @@ -1196,15 +1194,20 @@ VmSockPosixCloseSocket(
      /**** Delete from queue if this is NOT timeout ****/
      if ((pSocket->type == VM_SOCK_TYPE_SERVER) && (!(pSocket->bTimerExpired)))
      {
 -         dwError = VmSockPosixDeleteEventFromQueue(
 -                       pRESTHandle,
 -                       pRESTHandle->pSockContext->pEventQueue,
 -                       pSocket
 -                       );
 -         BAIL_ON_VMREST_ERROR(dwError);
 +        dwError = VmSockPosixDeleteEventFromQueue(
 +                      pRESTHandle,
 +                      pRESTHandle->pSockContext->pEventQueue,
 +                      pSocket
 +                      );
 +        if (dwError == VM_SOCK_POSIX_ERROR_SYS_CALL_FAILED)
 +        {
 +            VMREST_LOG_WARNING(pRESTHandle,"Delete of IO socket fd %d from event queue failed, still progressing with conn close", pSocket->fd);
 +            dwError = REST_ENGINE_SUCCESS;
 +        }
 +        BAIL_ON_VMREST_ERROR(dwError);
      }
  
 -    /**** Close IO socket fd ****/
 +    /**** Cleanup the SSL object associated with connection ****/
      if (pRESTHandle->pSSLInfo->isSecure && pSocket->ssl && (pSocket->type != VM_SOCK_TYPE_TIMER))
      {
          if (pSocket->bSSLHandShakeCompleted)
 @@ -1220,29 +1223,31 @@ VmSockPosixCloseSocket(
          pSocket->ssl = NULL;
      }
  
 -    if (pSocket->fd >= 0)
 +cleanup:
 +
 +    /**** Close IO socket fd ****/
 +    if (pSocket && pSocket->fd >= 0)
      {
 +        VMREST_LOG_INFO(pRESTHandle,"C-REST-ENGINE: Closing socket with fd %d, Socket Type %u ( 2-Io / 5-Timer )", pSocket->fd, pSocket->type);
          close(pSocket->fd);
          pSocket->fd = -1;
      }
  
 -    VmRESTUnlockMutex(pSocket->pMutex);
 -    bLockedIO = FALSE;
 -
 -cleanup:
 +    if (bLockedIO)
 +    {
 +        VmRESTUnlockMutex(pSocket->pMutex);
 +        bLockedIO = FALSE;
 +    }
  
      return dwError;
  
  error:
 +    VMREST_LOG_ERROR(pRESTHandle,"Error while closing socket..dwError = %u", dwError);
  
      if (bLockedTimer)
      {
          VmRESTUnlockMutex(pTimerSocket->pMutex);
 -    }
 -
 -    if (bLockedIO)
 -    {
 -        VmRESTUnlockMutex(pSocket->pMutex);
 +        bLockedTimer = FALSE;
      }
  
      goto cleanup;