From 0303c7a3d4959c60f8fea6d684a29df96c321afe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 24 Feb 2012 15:35:48 -0500 Subject: [PATCH] libfreerdp-auth: get FreeContextBuffer to work --- cunit/test_sspi.c | 6 ++++++ libfreerdp-auth/sspi.c | 25 +++++++++++++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/cunit/test_sspi.c b/cunit/test_sspi.c index 5b8d3fc4f..d698be47e 100644 --- a/cunit/test_sspi.c +++ b/cunit/test_sspi.c @@ -71,6 +71,8 @@ void test_EnumerateSecurityPackages(void) pPackageInfo[index].Name, pPackageInfo[index].Comment); } } + + FreeContextBuffer(pPackageInfo); } void test_QuerySecurityPackageInfo(void) @@ -145,6 +147,8 @@ void test_InitializeSecurityContext(void) status = QuerySecurityPackageInfo(NTLM_PACKAGE_NAME, &pPackageInfo); + printf("pPackageInfo: 0x%08X ppPackageInfo:0x%08X\n", pPackageInfo, &pPackageInfo); + if (status != SEC_E_OK) { printf("QuerySecurityPackageInfo status: 0x%08X\n", status); @@ -200,6 +204,8 @@ void test_InitializeSecurityContext(void) freerdp_hexdump((uint8*) p_sec_buffer->pvBuffer, p_sec_buffer->cbBuffer); table->FreeCredentialsHandle(&credentials); + + FreeContextBuffer(pPackageInfo); } diff --git a/libfreerdp-auth/sspi.c b/libfreerdp-auth/sspi.c index ca6a67724..4b7ae0514 100644 --- a/libfreerdp-auth/sspi.c +++ b/libfreerdp-auth/sspi.c @@ -76,7 +76,7 @@ void sspi_ContextBufferAllocTableNew() size_t size; ContextBufferAllocTable.cEntries = 0; - ContextBufferAllocTable.cMaxEntries = 64; + ContextBufferAllocTable.cMaxEntries = 4; size = sizeof(CONTEXT_BUFFER_ALLOC_ENTRY) * ContextBufferAllocTable.cMaxEntries; @@ -104,14 +104,18 @@ void sspi_ContextBufferAllocTableFree() void* sspi_ContextBufferAlloc(uint32 allocatorIndex, size_t size) { int index; + void* contextBuffer; for (index = 0; index < ContextBufferAllocTable.cMaxEntries; index++) { if (ContextBufferAllocTable.entries[index].contextBuffer == NULL) { + contextBuffer = xzalloc(size); ContextBufferAllocTable.cEntries++; - ContextBufferAllocTable.entries[index].contextBuffer = xzalloc(size); + + ContextBufferAllocTable.entries[index].contextBuffer = contextBuffer; ContextBufferAllocTable.entries[index].allocatorIndex = allocatorIndex; + return ContextBufferAllocTable.entries[index].contextBuffer; } } @@ -125,8 +129,8 @@ void* sspi_ContextBufferAlloc(uint32 allocatorIndex, size_t size) return sspi_ContextBufferAlloc(allocatorIndex, size); } -void FreeContextBuffer_EnumerateSecurityPackages(SEC_PKG_INFO* pPackageInfo); -void FreeContextBuffer_QuerySecurityPackageInfo(SEC_PKG_INFO* pPackageInfo); +void FreeContextBuffer_EnumerateSecurityPackages(void* contextBuffer); +void FreeContextBuffer_QuerySecurityPackageInfo(void* contextBuffer); void sspi_ContextBufferFree(void* contextBuffer) { @@ -137,20 +141,22 @@ void sspi_ContextBufferFree(void* contextBuffer) { if (contextBuffer == ContextBufferAllocTable.entries[index].contextBuffer) { + contextBuffer = ContextBufferAllocTable.entries[index].contextBuffer; allocatorIndex = ContextBufferAllocTable.entries[index].allocatorIndex; ContextBufferAllocTable.cEntries--; + ContextBufferAllocTable.entries[index].allocatorIndex = 0; ContextBufferAllocTable.entries[index].contextBuffer = NULL; switch (allocatorIndex) { case EnumerateSecurityPackagesIndex: - FreeContextBuffer_EnumerateSecurityPackages((SEC_PKG_INFO*) contextBuffer); + FreeContextBuffer_EnumerateSecurityPackages(contextBuffer); break; case QuerySecurityPackageInfoIndex: - FreeContextBuffer_QuerySecurityPackageInfo((SEC_PKG_INFO*) contextBuffer); + FreeContextBuffer_QuerySecurityPackageInfo(contextBuffer); break; } } @@ -308,10 +314,11 @@ SECURITY_STATUS EnumerateSecurityPackages(uint32* pcPackages, SEC_PKG_INFO** ppP return SEC_E_OK; } -void FreeContextBuffer_EnumerateSecurityPackages(SEC_PKG_INFO* pPackageInfo) +void FreeContextBuffer_EnumerateSecurityPackages(void* contextBuffer) { int index; uint32 cPackages; + SEC_PKG_INFO* pPackageInfo = (SEC_PKG_INFO*) contextBuffer; cPackages = sizeof(SEC_PKG_INFO_LIST) / sizeof(SEC_PKG_INFO*); @@ -369,8 +376,10 @@ SECURITY_STATUS QuerySecurityPackageInfo(char* pszPackageName, SEC_PKG_INFO** pp return SEC_E_SECPKG_NOT_FOUND; } -void FreeContextBuffer_QuerySecurityPackageInfo(SEC_PKG_INFO* pPackageInfo) +void FreeContextBuffer_QuerySecurityPackageInfo(void* contextBuffer) { + SEC_PKG_INFO* pPackageInfo = (SEC_PKG_INFO*) contextBuffer; + if (pPackageInfo->Name) xfree(pPackageInfo->Name);