From fd3c8335fd91e9a1952eabf4abd1cf8b5631dfd5 Mon Sep 17 00:00:00 2001 From: Dylan Smith Date: Mon, 28 Sep 2009 03:48:38 -0400 Subject: [PATCH] secur32: Free schannel handle table. 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 file changed, 25 insertions(+) diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c index 3912fbd7d0c..f776206867e 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); }