Module: wine Branch: master Commit: 9894e109ac5ee0a8f6962f36a09bb5928485661f URL: https://source.winehq.org/git/wine.git/?a=commit;h=9894e109ac5ee0a8f6962f36a...
Author: Alexandre Julliard julliard@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@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)