Files
system76-edk2/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.c
Nickle Wang d10e058016 MdeModulePkg/RegularExpressionDxe: Fix memory assert in FreePool()
Memory buffer that is allocated by malloc() and realloc() will be
shifted by 8 bytes because Oniguruma keeps its memory signature. This 8
bytes shift is not handled while calling free() to release memory. Add
free() function to check Oniguruma signature before release memory
because memory buffer is not touched when using calloc().

Signed-off-by: Nickle Wang <nickle.wang@hpe.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
2021-07-07 07:04:47 +00:00

116 lines
2.6 KiB
C

/** @file
Module to rewrite stdlib references within Oniguruma
(C) Copyright 2014-2021 Hewlett Packard Enterprise Development LP<BR>
Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "OnigurumaUefiPort.h"
#define ONIGMEM_HEAD_SIGNATURE SIGNATURE_32('o','m','h','d')
typedef struct {
UINT32 Signature;
UINTN Size;
} ONIGMEM_HEAD;
#define ONIGMEM_OVERHEAD sizeof(ONIGMEM_HEAD)
int EFIAPI sprintf_s(char *str, size_t sizeOfBuffer, char const *fmt, ...)
{
VA_LIST Marker;
int NumberOfPrinted;
VA_START (Marker, fmt);
NumberOfPrinted = (int)AsciiVSPrint (str, sizeOfBuffer, fmt, Marker);
VA_END (Marker);
return NumberOfPrinted;
}
int OnigStrCmp (const char* Str1, const char* Str2)
{
return (int)AsciiStrCmp (Str1, Str2);
}
int strlen(const char* str)
{
return strlen_s(str, MAX_STRING_SIZE);
}
void * malloc (size_t size)
{
ONIGMEM_HEAD *PoolHdr;
UINTN NewSize;
VOID *Data;
NewSize = (UINTN)(size) + ONIGMEM_OVERHEAD;
Data = AllocatePool (NewSize);
if (Data != NULL) {
PoolHdr = (ONIGMEM_HEAD *)Data;
PoolHdr->Signature = ONIGMEM_HEAD_SIGNATURE;
PoolHdr->Size = size;
return (VOID *)(PoolHdr + 1);
}
return NULL;
}
void * realloc (void *ptr, size_t size)
{
ONIGMEM_HEAD *OldPoolHdr;
ONIGMEM_HEAD *NewPoolHdr;
UINTN OldSize;
UINTN NewSize;
VOID *Data;
NewSize = (UINTN)size + ONIGMEM_OVERHEAD;
Data = AllocatePool (NewSize);
if (Data != NULL) {
NewPoolHdr = (ONIGMEM_HEAD *)Data;
NewPoolHdr->Signature = ONIGMEM_HEAD_SIGNATURE;
NewPoolHdr->Size = size;
if (ptr != NULL) {
OldPoolHdr = (ONIGMEM_HEAD *)ptr - 1;
ASSERT (OldPoolHdr->Signature == ONIGMEM_HEAD_SIGNATURE);
OldSize = OldPoolHdr->Size;
CopyMem ((VOID *)(NewPoolHdr + 1), ptr, MIN (OldSize, size));
FreePool ((VOID *)OldPoolHdr);
}
return (VOID *)(NewPoolHdr + 1);
}
return NULL;
}
void* memcpy (void *dest, const void *src, unsigned int count)
{
return CopyMem (dest, src, (UINTN)count);
}
void* memset (void *dest, char ch, unsigned int count)
{
return SetMem (dest, count, ch);
}
void free(void *ptr)
{
VOID *EvalOnce;
ONIGMEM_HEAD *PoolHdr;
EvalOnce = ptr;
if (EvalOnce == NULL) {
return;
}
PoolHdr = (ONIGMEM_HEAD *)EvalOnce - 1;
if (PoolHdr->Signature == ONIGMEM_HEAD_SIGNATURE) {
FreePool (PoolHdr);
} else {
FreePool (EvalOnce);
}
}