Module: wine Branch: master Commit: 97ea9ee41ce7281ce3cde56cb9d25db118b30b37 URL: https://source.winehq.org/git/wine.git/?a=commit;h=97ea9ee41ce7281ce3cde56cb...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Dec 3 12:25:53 2021 +0100
secur32: Move the get_buffer callback to the Unix side.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/secur32/schannel.c | 86 +------------------------------------ dlls/secur32/schannel_gnutls.c | 96 ++++++++++++++++++++++++++++++++++++++---- dlls/secur32/secur32_priv.h | 5 --- 3 files changed, 89 insertions(+), 98 deletions(-)
diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c index d35372ed7fc..0dbffb485e6 100644 --- a/dlls/secur32/schannel.c +++ b/dlls/secur32/schannel.c @@ -665,85 +665,6 @@ static int schan_find_sec_buffer_idx(const SecBufferDesc *desc, unsigned int sta return -1; }
-static void schan_resize_current_buffer(const struct schan_buffers *s, SIZE_T min_size) -{ - SecBuffer *b = &s->desc->pBuffers[s->current_buffer_idx]; - SIZE_T new_size = b->cbBuffer ? b->cbBuffer * 2 : 128; - void *new_data; - - if (b->cbBuffer >= min_size || !s->allow_buffer_resize || min_size > UINT_MAX / 2) return; - - while (new_size < min_size) new_size *= 2; - - if (b->pvBuffer) /* freed with FreeContextBuffer */ - new_data = RtlReAllocateHeap(GetProcessHeap(), 0, b->pvBuffer, new_size); - else - new_data = RtlAllocateHeap(GetProcessHeap(), 0, new_size); - - if (!new_data) - { - TRACE("Failed to resize %p from %d to %ld\n", b->pvBuffer, b->cbBuffer, new_size); - return; - } - - b->cbBuffer = new_size; - b->pvBuffer = new_data; -} - -static char * CDECL schan_get_buffer(const struct schan_transport *t, struct schan_buffers *s, SIZE_T *count) -{ - SIZE_T max_count; - PSecBuffer buffer; - - if (!s->desc) - { - TRACE("No desc\n"); - return NULL; - } - - if (s->current_buffer_idx == -1) - { - /* Initial buffer */ - int buffer_idx = s->get_next_buffer(t, s); - if (buffer_idx == -1) - { - TRACE("No next buffer\n"); - return NULL; - } - s->current_buffer_idx = buffer_idx; - } - - buffer = &s->desc->pBuffers[s->current_buffer_idx]; - TRACE("Using buffer %d: cbBuffer %d, BufferType %#x, pvBuffer %p\n", s->current_buffer_idx, buffer->cbBuffer, buffer->BufferType, buffer->pvBuffer); - - schan_resize_current_buffer(s, s->offset + *count); - max_count = buffer->cbBuffer - s->offset; - if (s->limit != ~0UL && s->limit < max_count) - max_count = s->limit; - if (!max_count) - { - int buffer_idx; - - s->allow_buffer_resize = FALSE; - buffer_idx = s->get_next_buffer(t, s); - if (buffer_idx == -1) - { - TRACE("No next buffer\n"); - return NULL; - } - s->current_buffer_idx = buffer_idx; - s->offset = 0; - return schan_get_buffer(t, s, count); - } - - if (*count > max_count) - *count = max_count; - if (s->limit != ~0UL) - s->limit -= *count; - - return (char *)buffer->pvBuffer + s->offset; -} - static int schan_init_sec_ctx_get_next_input_buffer(const struct schan_transport *t, struct schan_buffers *s) { if (s->current_buffer_idx != -1) @@ -1566,11 +1487,6 @@ static const SecurityFunctionTableW schanTableW = { NULL, /* SetContextAttributesW */ };
-const struct schan_callbacks schan_callbacks = -{ - schan_get_buffer, -}; - void SECUR32_initSchannelSP(void) { /* This is what Windows reports. This shouldn't break any applications @@ -1596,7 +1512,7 @@ void SECUR32_initSchannelSP(void) }; SecureProvider *provider;
- if (!schan_funcs && __wine_init_unix_lib(hsecur32, DLL_PROCESS_ATTACH, &schan_callbacks, &schan_funcs)) + if (!schan_funcs && __wine_init_unix_lib(hsecur32, DLL_PROCESS_ATTACH, NULL, &schan_funcs)) { ERR( "no schannel support, expect problems\n" ); return; diff --git a/dlls/secur32/schannel_gnutls.c b/dlls/secur32/schannel_gnutls.c index 9b0833efcf5..7eca22b2967 100644 --- a/dlls/secur32/schannel_gnutls.c +++ b/dlls/secur32/schannel_gnutls.c @@ -52,8 +52,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(secur32); WINE_DECLARE_DEBUG_CHANNEL(winediag);
-static const struct schan_callbacks *callbacks; - /* Not present in gnutls version < 2.9.10. */ static int (*pgnutls_cipher_get_block_size)(gnutls_cipher_algorithm_t);
@@ -199,6 +197,89 @@ static void compat_gnutls_dtls_set_mtu(gnutls_session_t session, unsigned int mt FIXME("\n"); }
+static void resize_current_buffer(const struct schan_buffers *s, SIZE_T min_size) +{ + SecBuffer *b = &s->desc->pBuffers[s->current_buffer_idx]; + SIZE_T new_size = b->cbBuffer ? b->cbBuffer * 2 : 128; + void *new_data; + + if (b->cbBuffer >= min_size || !s->allow_buffer_resize || min_size > UINT_MAX / 2) return; + + while (new_size < min_size) new_size *= 2; + + if (b->pvBuffer) /* freed with FreeContextBuffer */ + new_data = RtlReAllocateHeap(GetProcessHeap(), 0, b->pvBuffer, new_size); + else + new_data = RtlAllocateHeap(GetProcessHeap(), 0, new_size); + + if (!new_data) + { + TRACE("Failed to resize %p from %d to %ld\n", b->pvBuffer, b->cbBuffer, new_size); + return; + } + + b->cbBuffer = new_size; + b->pvBuffer = new_data; +} + +static char *get_buffer(const struct schan_transport *t, struct schan_buffers *s, SIZE_T *count) +{ + SIZE_T max_count; + PSecBuffer buffer; + + if (!s->desc) + { + TRACE("No desc\n"); + return NULL; + } + + if (s->current_buffer_idx == -1) + { + /* Initial buffer */ + int buffer_idx = s->get_next_buffer(t, s); + if (buffer_idx == -1) + { + TRACE("No next buffer\n"); + return NULL; + } + s->current_buffer_idx = buffer_idx; + } + + buffer = &s->desc->pBuffers[s->current_buffer_idx]; + TRACE("Using buffer %d: cbBuffer %d, BufferType %#x, pvBuffer %p\n", s->current_buffer_idx, buffer->cbBuffer, buffer->BufferType, buffer->pvBuffer); + + resize_current_buffer(s, s->offset + *count); + max_count = buffer->cbBuffer - s->offset; + if (s->limit != ~0UL && s->limit < max_count) + max_count = s->limit; + + while (!max_count) + { + int buffer_idx; + + s->allow_buffer_resize = FALSE; + buffer_idx = s->get_next_buffer(t, s); + if (buffer_idx == -1) + { + TRACE("No next buffer\n"); + return NULL; + } + s->current_buffer_idx = buffer_idx; + s->offset = 0; + buffer = &s->desc->pBuffers[buffer_idx]; + max_count = buffer->cbBuffer; + if (s->limit != ~0UL && s->limit < max_count) + max_count = s->limit; + } + + if (*count > max_count) + *count = max_count; + if (s->limit != ~0UL) + s->limit -= *count; + + return (char *)buffer->pvBuffer + s->offset; +} + static ssize_t pull_adapter(gnutls_transport_ptr_t transport, void *buff, size_t buff_len) { struct schan_transport *t = (struct schan_transport*)transport; @@ -208,7 +289,7 @@ static ssize_t pull_adapter(gnutls_transport_ptr_t transport, void *buff, size_t
TRACE("Push %lu bytes\n", len);
- b = callbacks->get_buffer(t, &t->in, &len); + b = get_buffer(t, &t->in, &len); if (!b) { pgnutls_transport_set_errno(s, EAGAIN); @@ -229,7 +310,7 @@ static ssize_t push_adapter(gnutls_transport_ptr_t transport, const void *buff,
TRACE("Push %lu bytes\n", len);
- b = callbacks->get_buffer(t, &t->out, &len); + b = get_buffer(t, &t->out, &len); if (!b) { pgnutls_transport_set_errno(s, EAGAIN); @@ -300,7 +381,7 @@ static int pull_timeout(gnutls_transport_ptr_t transport, unsigned int timeout)
TRACE("\n");
- if (callbacks->get_buffer(t, &t->in, &count)) return 1; + if (get_buffer(t, &t->in, &count)) return 1; pgnutls_transport_set_errno(s, EAGAIN); return -1; } @@ -661,7 +742,7 @@ static SECURITY_STATUS CDECL schan_send(schan_session session, const void *buffe struct schan_transport *t = (struct schan_transport *)pgnutls_transport_get_ptr(s); SIZE_T count = 0;
- if (callbacks->get_buffer(t, &t->out, &count)) continue; + if (get_buffer(t, &t->out, &count)) continue; return SEC_I_CONTINUE_NEEDED; } else @@ -687,7 +768,7 @@ again: struct schan_transport *t = (struct schan_transport *)pgnutls_transport_get_ptr(s); SIZE_T count = 0;
- if (callbacks->get_buffer(t, &t->in, &count)) + if (get_buffer(t, &t->in, &count)) goto again;
return SEC_I_CONTINUE_NEEDED; @@ -1118,7 +1199,6 @@ NTSTATUS CDECL __wine_init_unix_lib( HMODULE module, DWORD reason, const void *p { case DLL_PROCESS_ATTACH: if (!gnutls_initialize()) return STATUS_DLL_NOT_FOUND; - callbacks = ptr_in; *(const struct schan_funcs **)ptr_out = &funcs; break; case DLL_PROCESS_DETACH: diff --git a/dlls/secur32/secur32_priv.h b/dlls/secur32/secur32_priv.h index 88effe07a81..e4c39e476bc 100644 --- a/dlls/secur32/secur32_priv.h +++ b/dlls/secur32/secur32_priv.h @@ -137,11 +137,6 @@ struct schan_funcs void (CDECL *set_session_transport)(schan_session, struct schan_transport *); };
-struct schan_callbacks -{ - char * (CDECL *get_buffer)(const struct schan_transport *, struct schan_buffers *, SIZE_T *); -}; - extern const struct schan_funcs *schan_funcs;
#endif /* __SECUR32_PRIV_H__ */