VOID VMCARpcFreeCertificateContainer(PVMCA_CERTIFICATE_CONTAINER pCertContainer) { if (pCertContainer != NULL) { VMCARpcFreeMemory(pCertContainer->pCert); VMCARpcFreeMemory(pCertContainer); pCertContainer = NULL; } }
VOID VMCARpcFreeCertificateArray(PVMCA_CERTIFICATE_ARRAY pCertArray) { if (pCertArray == NULL) return; if (pCertArray->dwCount > 0) { unsigned int iEntry = 0; // free string in each container for (; iEntry < pCertArray->dwCount; iEntry++) { VMCARpcFreeMemory( pCertArray->certificates[iEntry].pCert); } VMCARpcFreeMemory(pCertArray); } }
DWORD VMCARpcAllocateStringW( RP_PWSTR pwszSrc, RP_PWSTR* ppwszDst ) { DWORD dwError = 0; size_t len = 0; RP_PWSTR pwszDst = NULL; if (!pwszSrc || !ppwszDst) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMCA_ERROR(dwError); } dwError = LwWc16sLen(pwszSrc, &len); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCARpcAllocateMemory( sizeof(RP_WSTR) * (len + 1), (PVOID*)&pwszDst); BAIL_ON_VMCA_ERROR(dwError); dwError = LwWc16snCpy(pwszDst, pwszSrc, len); BAIL_ON_VMCA_ERROR(dwError); *ppwszDst = pwszDst; cleanup: return dwError; error: if (ppwszDst) { *ppwszDst = NULL; } if (pwszDst) { VMCARpcFreeMemory(pwszDst); } goto cleanup; }
DWORD VMCARpcAllocateString( PSTR pszSrc, PSTR* ppszDst ) { DWORD dwError = 0; size_t len = 0; PSTR pszDst = NULL; if (!pszSrc || !ppszDst) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMCA_ERROR(dwError); } len = strlen(pszSrc); // + 1 for \'0' dwError = VMCARpcAllocateMemory( sizeof(RP_STR) * (len + 1), (PVOID*)&pszDst); BAIL_ON_VMCA_ERROR(dwError); memcpy(pszDst, pszSrc, len); *ppszDst = pszDst; cleanup: return dwError; error: if (ppszDst) { *ppszDst = NULL; } if (pszDst) { VMCARpcFreeMemory(pszDst); } goto cleanup; }
DWORD VMCARpcAllocateUnicodeStringFromAnsi( RP_PCSTR pszSrc, RP_PWSTR* ppwszDst ) { DWORD dwError = 0; RP_PWSTR pwszTmp = NULL; RP_PWSTR pwszDst = NULL; dwError = LwMbsToWc16s(pszSrc, &pwszTmp); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCARpcAllocateStringW(pwszTmp, &pwszDst); BAIL_ON_VMCA_ERROR(dwError); *ppwszDst = pwszDst; cleanup: if (pwszTmp) { LwFreeMemory(pwszTmp); } return dwError; error: *ppwszDst = NULL; if (pwszDst) { VMCARpcFreeMemory(pwszDst); } goto cleanup; }
unsigned int VMCAGetCRL( unsigned char *pszClientCachedCRLID, unsigned int dwFileOffset, unsigned int dwSize, VMCA_FILE_BUFFER **ppCRLData ) { DWORD dwError = 0; PVMCA_FILE_BUFFER pCRLData = NULL; DWORD dwCount = 0; PSTR pszCRLFile = NULL; unsigned char buff[FILE_CHUNK] = { 0 }; BOOLEAN bLocked = FALSE; VMCA_LOCK_MUTEX_SHARED(&gVMCAServerGlobals.svcMutex, bLocked); dwError = VMCASrvValidateCA(); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCAGetCRLNamePath(&pszCRLFile); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCARpcAllocateMemory( sizeof(VMCA_FILE_BUFFER), (PVOID*)&pCRLData); BAIL_ON_VMCA_ERROR(dwError); memset(pCRLData, 0, sizeof(VMCA_FILE_BUFFER)); dwError = VMCAReadDataFromFile( pszCRLFile, dwFileOffset, dwSize, (char*)&buff, &dwCount); BAIL_ON_VMCA_ERROR(dwError); if (dwCount > 0) { dwError = VMCARpcAllocateMemory(dwCount * sizeof(unsigned char), (PVOID*) &pCRLData->buffer); BAIL_ON_VMCA_ERROR(dwError); memcpy((PVOID) pCRLData->buffer, buff,(size_t) dwCount); } pCRLData->dwCount = dwCount; *ppCRLData = pCRLData; cleanup : VMCA_LOCK_MUTEX_UNLOCK(&gVMCAServerGlobals.svcMutex, bLocked); VMCA_SAFE_FREE_STRINGA(pszCRLFile); return dwError; error: if(pCRLData != NULL) { if(pCRLData->buffer != NULL) { VMCARpcFreeMemory((PVOID) pCRLData->buffer); } VMCARpcFreeMemory((PVOID)pCRLData); } if(ppCRLData) { *ppCRLData = NULL; } goto cleanup; }
unsigned int RpcVMCAGetCRL( handle_t IDL_handle, unsigned char *pszClientCachedCRLID, unsigned int dwFileOffset, unsigned int dwSize, VMCA_FILE_BUFFER **ppCRLData ) { DWORD dwError = 0; VMCA_FILE_BUFFER* pTempCRLData = NULL; VMCA_FILE_BUFFER* pCRLData = NULL; VMCA_LOG_DEBUG("Entering %s", __FUNCTION__); if(ppCRLData == NULL) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMCA_ERROR(dwError); } dwError = VMCACheckAccess(IDL_handle, FALSE); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCAGetCRL( dwFileOffset, dwSize, &pTempCRLData); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCARpcAllocateMemory ( sizeof(pCRLData), (PVOID*) &pCRLData ); BAIL_ON_VMCA_ERROR(dwError); pCRLData->dwCount = pTempCRLData->dwCount; if(pCRLData->dwCount > 0) { dwError = VMCARpcAllocateMemory( pCRLData->dwCount * sizeof(unsigned char), (PVOID*) &pCRLData->buffer); BAIL_ON_VMCA_ERROR(dwError); memcpy( (PVOID*) pCRLData->buffer, pTempCRLData->buffer, (size_t) pCRLData->dwCount); } *ppCRLData = pCRLData; pTempCRLData = NULL; cleanup: if ( pTempCRLData ) { VMCA_SAFE_FREE_MEMORY(pTempCRLData->buffer); VMCA_SAFE_FREE_MEMORY(pTempCRLData); } VMCA_LOG_DEBUG("Exiting %s, Status = %d", __FUNCTION__, dwError); return dwError; error: if (ppCRLData) { *ppCRLData = NULL; } if(pCRLData) { if(pCRLData->buffer) { VMCARpcFreeMemory((PVOID) pCRLData->buffer); } VMCARpcFreeMemory((PVOID)pCRLData); } goto cleanup; }