secur32: Extract schan_imp_recv function.
authorKen Thomases <ken@codeweavers.com>
Sun, 13 Mar 2011 23:57:08 +0000 (18:57 -0500)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 14 Mar 2011 13:09:12 +0000 (14:09 +0100)
dlls/secur32/schannel.c

index 3a7113eb4dd0336f768774a634165d0a29c28d84..b8aaaaddb2032ce6c4a9b66316c514be255507f4 100644 (file)
@@ -89,6 +89,23 @@ static SECURITY_STATUS schan_imp_send(gnutls_session_t s, const void *buffer,
     return SEC_E_OK;
 }
 
+static SECURITY_STATUS schan_imp_recv(gnutls_session_t s, void *buffer,
+                                      size_t *length)
+{
+    ssize_t ret = pgnutls_record_recv(s, buffer, *length);
+    if (ret >= 0)
+        *length = ret;
+    else if (ret == GNUTLS_E_AGAIN)
+        return SEC_I_CONTINUE_NEEDED;
+    else
+    {
+        pgnutls_perror(ret);
+        return SEC_E_INTERNAL_ERROR;
+    }
+
+    return SEC_E_OK;
+}
+
 
 #define SCHAN_INVALID_HANDLE ~0UL
 
@@ -1245,7 +1262,6 @@ static SECURITY_STATUS SEC_ENTRY schan_DecryptMessage(PCtxtHandle context_handle
     char *data;
     unsigned expected_size;
     ssize_t received = 0;
-    ssize_t ret;
     int idx;
     unsigned char *buf_ptr;
 
@@ -1291,32 +1307,28 @@ static SECURITY_STATUS SEC_ENTRY schan_DecryptMessage(PCtxtHandle context_handle
 
     while (received < data_size)
     {
-        ret = pgnutls_record_recv(ctx->session, data + received, data_size - received);
-        if (ret < 0)
+        size_t length = data_size - received;
+        SECURITY_STATUS status = schan_imp_recv(ctx->session, data + received, &length);
+        if (status == SEC_I_CONTINUE_NEEDED)
         {
-            if (ret == GNUTLS_E_AGAIN)
+            if (!received)
             {
-                if (!received)
-                {
-                    pgnutls_perror(ret);
-                    HeapFree(GetProcessHeap(), 0, data);
-                    TRACE("Returning SEC_E_INCOMPLETE_MESSAGE\n");
-                    return SEC_E_INCOMPLETE_MESSAGE;
-                }
-                break;
-            }
-            else
-            {
-                pgnutls_perror(ret);
                 HeapFree(GetProcessHeap(), 0, data);
-                ERR("Returning SEC_E_INTERNAL_ERROR\n");
-                return SEC_E_INTERNAL_ERROR;
+                TRACE("Returning SEC_E_INCOMPLETE_MESSAGE\n");
+                return SEC_E_INCOMPLETE_MESSAGE;
             }
+            break;
+        }
+        else if (status != SEC_E_OK)
+        {
+            HeapFree(GetProcessHeap(), 0, data);
+            ERR("Returning %d\n", status);
+            return status;
         }
-        else if (!ret)
+        else if (!length)
             break;
 
-        received += ret;
+        received += length;
     }
 
     TRACE("Received %zd bytes\n", received);