Module: wine Branch: master Commit: fde1e003faf19d5c80ca7bd7b205f7294891a2fb URL: http://source.winehq.org/git/wine.git/?a=commit;h=fde1e003faf19d5c80ca7bd7b2...
Author: Henri Verbeet hverbeet@gmail.com Date: Mon Sep 22 22:14:04 2008 +0200
secur32: Allocate schannel client credentials.
---
dlls/secur32/schannel.c | 55 +++++++++++++++++++++++++++++++++++++++++- dlls/secur32/secur32.c | 2 + dlls/secur32/secur32_priv.h | 3 ++ 3 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c index 1633a70..e24f7f5 100644 --- a/dlls/secur32/schannel.c +++ b/dlls/secur32/schannel.c @@ -19,19 +19,33 @@ * implementation. */ #include "config.h" +#include "wine/port.h"
#include <stdarg.h> +#ifdef SONAME_LIBGNUTLS +#include <gnutls/gnutls.h> +#endif + #include "windef.h" #include "winbase.h" #include "sspi.h" #include "schannel.h" #include "secur32_priv.h" #include "wine/debug.h" +#include "wine/library.h"
WINE_DEFAULT_DEBUG_CHANNEL(secur32);
#ifdef SONAME_LIBGNUTLS
+static void *libgnutls_handle; +#define MAKE_FUNCPTR(f) static typeof(f) * p##f +MAKE_FUNCPTR(gnutls_certificate_allocate_credentials); +MAKE_FUNCPTR(gnutls_certificate_free_credentials); +MAKE_FUNCPTR(gnutls_global_deinit); +MAKE_FUNCPTR(gnutls_global_init); +#undef MAKE_FUNCPTR + enum schan_handle_type { SCHAN_HANDLE_CRED, @@ -47,6 +61,7 @@ struct schan_handle struct schan_credentials { ULONG credential_use; + gnutls_certificate_credentials_t credentials; };
static struct schan_handle *schan_handle_table; @@ -273,6 +288,7 @@ static SECURITY_STATUS schan_AcquireClientCredentials(const SCHANNEL_CRED *schan }
creds->credential_use = SECPKG_CRED_OUTBOUND; + pgnutls_certificate_allocate_credentials(&creds->credentials);
phCredential->dwLower = handle; phCredential->dwUpper = 0; @@ -371,6 +387,8 @@ static SECURITY_STATUS SEC_ENTRY schan_FreeCredentialsHandle( creds = schan_free_handle(phCredential->dwLower, SCHAN_HANDLE_CRED); if (!creds) return SEC_E_INVALID_HANDLE;
+ if (creds->credential_use == SECPKG_CRED_OUTBOUND) + pgnutls_certificate_free_credentials(creds->credentials); HeapFree(GetProcessHeap(), 0, creds);
return SEC_E_OK; @@ -496,8 +514,32 @@ static const WCHAR schannelDllName[] = { 's','c','h','a','n','n','e','l','.','d'
void SECUR32_initSchannelSP(void) { - SecureProvider *provider = SECUR32_addProvider(&schanTableA, &schanTableW, - schannelDllName); + SecureProvider *provider; + + + libgnutls_handle = wine_dlopen(SONAME_LIBGNUTLS, RTLD_NOW, NULL, 0); + if (!libgnutls_handle) + { + WARN("Failed to load libgnutls.\n"); + return; + } + +#define LOAD_FUNCPTR(f) \ + if (!(p##f = wine_dlsym(libgnutls_handle, #f, NULL, 0))) \ + { \ + ERR("Failed to load %s\n", #f); \ + wine_dlclose(libgnutls_handle, NULL, 0); \ + libgnutls_handle = NULL; \ + return; \ + } + + LOAD_FUNCPTR(gnutls_certificate_allocate_credentials) + LOAD_FUNCPTR(gnutls_certificate_free_credentials) + LOAD_FUNCPTR(gnutls_global_deinit) + LOAD_FUNCPTR(gnutls_global_init) +#undef LOAD_FUNCPTR + + provider = SECUR32_addProvider(&schanTableA, &schanTableW, schannelDllName);
if (provider) { @@ -530,11 +572,20 @@ void SECUR32_initSchannelSP(void)
schan_handle_table = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 64 * sizeof(*schan_handle_table)); schan_handle_table_size = 64; + + pgnutls_global_init(); } }
+void SECUR32_deinitSchannelSP(void) +{ + pgnutls_global_deinit(); + if (libgnutls_handle) wine_dlclose(libgnutls_handle, NULL, 0); +} + #else /* SONAME_LIBGNUTLS */
void SECUR32_initSchannelSP(void) {} +void SECUR32_deinitSchannelSP(void) {}
#endif /* SONAME_LIBGNUTLS */ diff --git a/dlls/secur32/secur32.c b/dlls/secur32/secur32.c index 4a434ac..27e0263 100644 --- a/dlls/secur32/secur32.c +++ b/dlls/secur32/secur32.c @@ -673,6 +673,8 @@ static void SECUR32_freeProviders(void) TRACE("\n"); EnterCriticalSection(&cs);
+ SECUR32_deinitSchannelSP(); + if (packageTable) { LIST_FOR_EACH_ENTRY(package, &packageTable->table, SecurePackage, entry) diff --git a/dlls/secur32/secur32_priv.h b/dlls/secur32/secur32_priv.h index 6f9c1e7..9eed1a5 100644 --- a/dlls/secur32/secur32_priv.h +++ b/dlls/secur32/secur32_priv.h @@ -124,6 +124,9 @@ void SECUR32_initSchannelSP(void); void SECUR32_initNegotiateSP(void); void SECUR32_initNTLMSP(void);
+/* Cleanup functions for built-in providers */ +void SECUR32_deinitSchannelSP(void); + /* Functions from dispatcher.c used elsewhere in the code */ SECURITY_STATUS fork_helper(PNegoHelper *new_helper, const char *prog, char * const argv[]);