From 366f728c4ddfe2f4c23f049f572ff6858b3ceca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Sun, 8 May 2016 21:52:06 +0200 Subject: secur32: Set output buffer size to zero during handshake when no data needs to be sent. --- dlls/secur32/schannel.c | 19 ++++++++++++------- dlls/secur32/tests/schannel.c | 10 ++++++++-- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c index 88b6521a7d8..cbfbc32ba1e 100644 --- a/dlls/secur32/schannel.c +++ b/dlls/secur32/schannel.c @@ -901,6 +901,18 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW( /* Perform the TLS handshake */ ret = schan_imp_handshake(ctx->session); + out_buffers = &ctx->transport.out; + if (out_buffers->current_buffer_idx != -1) + { + SecBuffer *buffer = &out_buffers->desc->pBuffers[out_buffers->current_buffer_idx]; + buffer->cbBuffer = out_buffers->offset; + } + else if (out_buffers->desc && out_buffers->desc->cBuffers > 0) + { + SecBuffer *buffer = &out_buffers->desc->pBuffers[0]; + buffer->cbBuffer = 0; + } + if(ctx->transport.in.offset && ctx->transport.in.offset != pInput->pBuffers[0].cbBuffer) { if(pInput->cBuffers<2 || pInput->pBuffers[1].BufferType!=SECBUFFER_EMPTY) return SEC_E_INVALID_TOKEN; @@ -909,13 +921,6 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW( pInput->pBuffers[1].cbBuffer = pInput->pBuffers[0].cbBuffer-ctx->transport.in.offset; } - out_buffers = &ctx->transport.out; - if (out_buffers->current_buffer_idx != -1) - { - SecBuffer *buffer = &out_buffers->desc->pBuffers[out_buffers->current_buffer_idx]; - buffer->cbBuffer = out_buffers->offset; - } - *pfContextAttr = 0; if (ctx->req_ctx_attr & ISC_REQ_REPLAY_DETECT) *pfContextAttr |= ISC_RET_REPLAY_DETECT; diff --git a/dlls/secur32/tests/schannel.c b/dlls/secur32/tests/schannel.c index b5ed169a978..110d4d8c397 100644 --- a/dlls/secur32/tests/schannel.c +++ b/dlls/secur32/tests/schannel.c @@ -771,7 +771,6 @@ todo_wine ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM, 0, 0, &buffers[1], 0, NULL, &buffers[0], &attrs, NULL); ok(status == SEC_E_INVALID_TOKEN, "Expected SEC_E_INVALID_TOKEN, got %08x\n", status); -todo_wine ok(buffers[0].pBuffers[0].cbBuffer == 0, "Output buffer size was not set to 0.\n"); buffers[0].pBuffers[0].cbBuffer = 0; @@ -781,9 +780,15 @@ todo_wine todo_wine ok(status == SEC_E_INSUFFICIENT_MEMORY || status == SEC_E_INVALID_TOKEN, "Expected SEC_E_INSUFFICIENT_MEMORY or SEC_E_INVALID_TOKEN, got %08x\n", status); + ok(buffers[0].pBuffers[0].cbBuffer == 0, "Output buffer size was not set to 0.\n"); - buffers[0].pBuffers[0].cbBuffer = buf_size; + status = InitializeSecurityContextA(&cred_handle, NULL, (SEC_CHAR *)"localhost", + ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM, + 0, 0, NULL, 0, &context, NULL, &attrs, NULL); +todo_wine + ok(status == SEC_E_INVALID_TOKEN, "Expected SEC_E_INVALID_TOKEN, got %08x\n", status); + buffers[0].pBuffers[0].cbBuffer = buf_size; status = InitializeSecurityContextA(&cred_handle, NULL, (SEC_CHAR *)"localhost", ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM, 0, 0, NULL, 0, &context, &buffers[0], &attrs, NULL); @@ -858,6 +863,7 @@ todo_wine buffers[1].pBuffers[0].cbBuffer = buf_size; } + ok(buffers[0].pBuffers[0].cbBuffer == 0, "Output buffer size was not set to 0.\n"); ok(status == SEC_E_OK || broken(status == SEC_E_INVALID_TOKEN) /* WinNT */, "InitializeSecurityContext failed: %08x\n", status); if(status != SEC_E_OK) { -- 2.14.1