/** @file Base Memory Allocation Routines Wrapper for Crypto library over OpenSSL during PEI & DXE phases. Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include // // Extra header to record the memory buffer size from malloc routine. // #define CRYPTMEM_HEAD_SIGNATURE SIGNATURE_32('c','m','h','d') typedef struct { UINT32 Signature; UINT32 Reserved; UINTN Size; } CRYPTMEM_HEAD; #define CRYPTMEM_OVERHEAD sizeof(CRYPTMEM_HEAD) // // -- Memory-Allocation Routines -- // /* Allocates memory blocks */ void * CryptoPkg_BaseMemAllocation_malloc ( size_t size ) { CRYPTMEM_HEAD *PoolHdr; UINTN NewSize; VOID *Data; // // Adjust the size by the buffer header overhead // NewSize = (UINTN)(size) + CRYPTMEM_OVERHEAD; Data = AllocatePool (NewSize); if (Data != NULL) { PoolHdr = (CRYPTMEM_HEAD *)Data; // // Record the memory brief information // PoolHdr->Signature = CRYPTMEM_HEAD_SIGNATURE; PoolHdr->Size = size; return (VOID *)(PoolHdr + 1); } else { // // The buffer allocation failed. // return NULL; } } /* Reallocate memory blocks */ void * CryptoPkg_BaseMemAllocation_realloc ( void *ptr, size_t size ) { CRYPTMEM_HEAD *OldPoolHdr; CRYPTMEM_HEAD *NewPoolHdr; UINTN OldSize; UINTN NewSize; VOID *Data; NewSize = (UINTN)size + CRYPTMEM_OVERHEAD; Data = AllocatePool (NewSize); if (Data != NULL) { NewPoolHdr = (CRYPTMEM_HEAD *)Data; NewPoolHdr->Signature = CRYPTMEM_HEAD_SIGNATURE; NewPoolHdr->Size = size; if (ptr != NULL) { // // Retrieve the original size from the buffer header. // OldPoolHdr = (CRYPTMEM_HEAD *)ptr - 1; ASSERT (OldPoolHdr->Signature == CRYPTMEM_HEAD_SIGNATURE); OldSize = OldPoolHdr->Size; // // Duplicate the buffer content. // CopyMem ((VOID *)(NewPoolHdr + 1), ptr, MIN (OldSize, size)); FreePool ((VOID *)OldPoolHdr); } return (VOID *)(NewPoolHdr + 1); } else { // // The buffer allocation failed. // return NULL; } } /* De-allocates or frees a memory block */ void CryptoPkg_BaseMemAllocation_free ( void *ptr ) { CRYPTMEM_HEAD *PoolHdr; // // In Standard C, free() handles a null pointer argument transparently. This // is not true of FreePool() below, so protect it. // if (ptr != NULL) { PoolHdr = (CRYPTMEM_HEAD *)ptr - 1; ASSERT (PoolHdr->Signature == CRYPTMEM_HEAD_SIGNATURE); FreePool (PoolHdr); } }