Alexandre Julliard : secur32: Move the decrypt message receive loop to the Unix side.

Alexandre Julliard julliard at winehq.org
Mon Dec 6 16:07:58 CST 2021


Module: wine
Branch: master
Commit: 9894e109ac5ee0a8f6962f36a09bb5928485661f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9894e109ac5ee0a8f6962f36a09bb5928485661f

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Dec  3 13:09:43 2021 +0100

secur32: Move the decrypt message receive loop to the Unix side.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/secur32/schannel.c        | 33 +++++++----------------------
 dlls/secur32/schannel_gnutls.c | 48 +++++++++++++++++++++++-------------------
 2 files changed, 34 insertions(+), 47 deletions(-)

diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c
index 0dbffb485e6..4217cc7334f 100644
--- a/dlls/secur32/schannel.c
+++ b/dlls/secur32/schannel.c
@@ -1319,7 +1319,7 @@ static SECURITY_STATUS SEC_ENTRY schan_DecryptMessage(PCtxtHandle context_handle
     SIZE_T data_size;
     char *data;
     unsigned expected_size;
-    SSIZE_T received = 0;
+    SIZE_T received = 0;
     int idx;
     unsigned char *buf_ptr;
 
@@ -1360,31 +1360,14 @@ static SECURITY_STATUS SEC_ENTRY schan_DecryptMessage(PCtxtHandle context_handle
     init_schan_buffers(&ctx->transport.in, message, schan_decrypt_message_get_next_buffer);
     ctx->transport.in.limit = expected_size;
 
-    while (received < data_size)
-    {
-        SIZE_T length = data_size - received;
-        status = schan_funcs->recv(ctx->transport.session, data + received, &length);
-
-        if (status == SEC_I_RENEGOTIATE)
-            break;
-
-        if (status == SEC_I_CONTINUE_NEEDED)
-        {
-            status = SEC_E_OK;
-            break;
-        }
+    received = data_size;
+    status = schan_funcs->recv(ctx->transport.session, data, &received);
 
-        if (status != SEC_E_OK)
-        {
-            free(data);
-            ERR("Returning %x\n", status);
-            return status;
-        }
-
-        if (!length)
-            break;
-
-        received += length;
+    if (status != SEC_E_OK && status != SEC_I_RENEGOTIATE)
+    {
+        free(data);
+        ERR("Returning %x\n", status);
+        return status;
     }
 
     TRACE("Received %ld bytes\n", received);
diff --git a/dlls/secur32/schannel_gnutls.c b/dlls/secur32/schannel_gnutls.c
index 7eca22b2967..df137321011 100644
--- a/dlls/secur32/schannel_gnutls.c
+++ b/dlls/secur32/schannel_gnutls.c
@@ -756,35 +756,39 @@ static SECURITY_STATUS CDECL schan_send(schan_session session, const void *buffe
 static SECURITY_STATUS CDECL schan_recv(schan_session session, void *buffer, SIZE_T *length)
 {
     gnutls_session_t s = (gnutls_session_t)session;
+    size_t data_size = *length;
+    size_t received = 0;
     ssize_t ret;
+    SECURITY_STATUS status = SEC_E_OK;
 
-again:
-    ret = pgnutls_record_recv(s, buffer, *length);
-
-    if (ret >= 0)
-        *length = ret;
-    else if (ret == GNUTLS_E_AGAIN)
+    while (received < data_size)
     {
-        struct schan_transport *t = (struct schan_transport *)pgnutls_transport_get_ptr(s);
-        SIZE_T count = 0;
+        ret = pgnutls_record_recv(s, (char *)buffer + received, data_size - received);
 
-        if (get_buffer(t, &t->in, &count))
-            goto again;
+        if (ret > 0) received += ret;
+        else if (!ret) break;
+        else if (ret == GNUTLS_E_AGAIN)
+        {
+            struct schan_transport *t = (struct schan_transport *)pgnutls_transport_get_ptr(s);
+            SIZE_T count = 0;
 
-        return SEC_I_CONTINUE_NEEDED;
-    }
-    else if (ret == GNUTLS_E_REHANDSHAKE)
-    {
-        TRACE("Rehandshake requested\n");
-        return SEC_I_RENEGOTIATE;
-    }
-    else
-    {
-        pgnutls_perror(ret);
-        return SEC_E_INTERNAL_ERROR;
+            if (!get_buffer(t, &t->in, &count)) break;
+        }
+        else if (ret == GNUTLS_E_REHANDSHAKE)
+        {
+            TRACE("Rehandshake requested\n");
+            status = SEC_I_RENEGOTIATE;
+            break;
+        }
+        else
+        {
+            pgnutls_perror(ret);
+            return SEC_E_INTERNAL_ERROR;
+        }
     }
 
-    return SEC_E_OK;
+    *length = received;
+    return status;
 }
 
 static unsigned int parse_alpn_protocol_list(unsigned char *buffer, unsigned int buflen, gnutls_datum_t *list)




More information about the wine-cvs mailing list