123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- /** @file
- Base Memory Allocation Routines Wrapper for Crypto library over OpenSSL
- during PEI & DXE phases.
- Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include <CrtLibSupport.h>
- #include <Library/MemoryAllocationLib.h>
- //
- // 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 *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 *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 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);
- }
- }
|