Alexandre Julliard : secur32: Move the get_buffer callback to the Unix side.

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


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

Author: Alexandre Julliard <julliard at 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 at 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__ */




More information about the wine-cvs mailing list