Hans Leidekker : secur32: Fix error return for DTLS contexts in schan_InitializeSecurityContextW().
Alexandre Julliard
julliard at winehq.org
Fri Oct 29 16:29:07 CDT 2021
Module: wine
Branch: master
Commit: 60474096693b6f0ad0e31c09e57a393c3538f3e6
URL: https://source.winehq.org/git/wine.git/?a=commit;h=60474096693b6f0ad0e31c09e57a393c3538f3e6
Author: Hans Leidekker <hans at codeweavers.com>
Date: Thu Oct 28 20:19:28 2021 +0200
secur32: Fix error return for DTLS contexts in schan_InitializeSecurityContextW().
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/secur32/schannel.c | 46 ++++++++++++++++++++++------------------------
1 file changed, 22 insertions(+), 24 deletions(-)
diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c
index 5b1a910a361..895364a3fc7 100644
--- a/dlls/secur32/schannel.c
+++ b/dlls/secur32/schannel.c
@@ -880,6 +880,11 @@ static inline SIZE_T read_record_size(const BYTE *buf, SIZE_T header_size)
return (buf[header_size - 2] << 8) | buf[header_size - 1];
}
+static inline BOOL is_dtls_context(const struct schan_context *ctx)
+{
+ return ctx->header_size == HEADER_SIZE_DTLS;
+}
+
/***********************************************************************
* InitializeSecurityContextW
*/
@@ -985,35 +990,28 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW(
unsigned char *ptr;
if (!(ctx = schan_get_object(phContext->dwLower, SCHAN_HANDLE_CTX))) return SEC_E_INVALID_HANDLE;
- if (pInput)
- {
- idx = schan_find_sec_buffer_idx(pInput, 0, SECBUFFER_TOKEN);
- if (idx == -1)
- return SEC_E_INCOMPLETE_MESSAGE;
-
- buffer = &pInput->pBuffers[idx];
- ptr = buffer->pvBuffer;
- expected_size = 0;
+ if (!pInput) return is_dtls_context(ctx) ? SEC_E_INSUFFICIENT_MEMORY : SEC_E_INCOMPLETE_MESSAGE;
+ if ((idx = schan_find_sec_buffer_idx(pInput, 0, SECBUFFER_TOKEN)) == -1) return SEC_E_INCOMPLETE_MESSAGE;
- while (buffer->cbBuffer > expected_size + ctx->header_size)
- {
- record_size = ctx->header_size + read_record_size(ptr, ctx->header_size);
+ buffer = &pInput->pBuffers[idx];
+ ptr = buffer->pvBuffer;
+ expected_size = 0;
- if (buffer->cbBuffer < expected_size + record_size)
- break;
+ while (buffer->cbBuffer > expected_size + ctx->header_size)
+ {
+ record_size = ctx->header_size + read_record_size(ptr, ctx->header_size);
- expected_size += record_size;
- ptr += record_size;
- }
+ if (buffer->cbBuffer < expected_size + record_size) break;
+ expected_size += record_size;
+ ptr += record_size;
+ }
- if (!expected_size)
- {
- TRACE("Expected at least %lu bytes, but buffer only contains %u bytes.\n",
- max(ctx->header_size + 1, record_size), buffer->cbBuffer);
- return SEC_E_INCOMPLETE_MESSAGE;
- }
+ if (!expected_size)
+ {
+ TRACE("Expected at least %lu bytes, but buffer only contains %u bytes.\n",
+ max(ctx->header_size + 1, record_size), buffer->cbBuffer);
+ return SEC_E_INCOMPLETE_MESSAGE;
}
- else return SEC_E_INCOMPLETE_MESSAGE;
TRACE("Using expected_size %lu.\n", expected_size);
}
More information about the wine-cvs
mailing list