secur32: Free schannel handle table.
Dylan Smith
dylan.ah.smith at gmail.com
Mon Sep 28 02:48:38 CDT 2009
The table is initialized on process attach, and should be freed on process
detach (which is where SECUR32_deinitSchannelSP gets called).
---
dlls/secur32/schannel.c | 25 +++++++++++++++++++++++++
1 files changed, 25 insertions(+), 0 deletions(-)
-------------- next part --------------
diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c
index 3912fbd..f776206 100644
--- a/dlls/secur32/schannel.c
+++ b/dlls/secur32/schannel.c
@@ -1413,8 +1413,33 @@ fail:
void SECUR32_deinitSchannelSP(void)
{
+ int i = schan_handle_table_size;
+
if (!libgnutls_handle) return;
+ /* deinitialized sessions first because a pointer to the credentials
+ * are stored for the session by calling gnutls_credentials_set. */
+ while (--i)
+ {
+ if (schan_handle_table[i].type == SCHAN_HANDLE_CTX)
+ {
+ struct schan_context *ctx = schan_free_handle(i, SCHAN_HANDLE_CTX);
+ pgnutls_deinit(ctx->session);
+ HeapFree(GetProcessHeap(), 0, ctx);
+ }
+ }
+ i = schan_handle_table_size;
+ while (--i)
+ {
+ if (schan_handle_table[i].type != SCHAN_HANDLE_FREE)
+ {
+ struct schan_credentials *cred;
+ cred = schan_free_handle(i, SCHAN_HANDLE_CRED);
+ pgnutls_certificate_free_credentials(cred->credentials);
+ HeapFree(GetProcessHeap(), 0, cred);
+ }
+ }
+ HeapFree(GetProcessHeap(), 0, schan_handle_table);
pgnutls_global_deinit();
wine_dlclose(libgnutls_handle, NULL, 0);
}
More information about the wine-patches
mailing list