Reviewed-by: Liming Gao <gaolim...@byosoft.com.cn> > -----邮件原件----- > 发件人: Nickle Wang <nickle.w...@hpe.com> > 发送时间: 2021年6月10日 12:57 > 收件人: devel@edk2.groups.io > 抄送: gaolim...@byosoft.com.cn; jian.j.w...@intel.com; > hao.a...@intel.com; Nickle Wang <nickle.w...@hpe.com> > 主题: [PATCH] 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.w...@hpe.com> > --- > .../RegularExpressionDxe/OnigurumaUefiPort.c | 19 > ++++++++++++++++++- > .../RegularExpressionDxe/OnigurumaUefiPort.h | 14 ++------------ > 2 files changed, 20 insertions(+), 13 deletions(-) > > diff --git > a/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.c > b/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.c > index 9aa7b0a68e..5c34324db8 100644 > --- a/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.c > +++ b/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.c > @@ -2,7 +2,7 @@ > > > Module to rewrite stdlib references within Oniguruma > > > > - (C) Copyright 2014-2015 Hewlett Packard Enterprise Development LP<BR> > > + (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 > > @@ -96,3 +96,20 @@ 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); > > + } > > +} > > diff --git > a/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.h > b/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.h > index 20b75c3361..0bdb7be529 100644 > --- a/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.h > +++ > b/MdeModulePkg/Universal/RegularExpressionDxe/OnigurumaUefiPort.h > @@ -2,7 +2,7 @@ > > > Module to rewrite stdlib references within Oniguruma > > > > - (C) Copyright 2014-2015 Hewlett Packard Enterprise Development LP<BR> > > + (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 > > @@ -46,17 +46,6 @@ typedef INTN intptr_t; > #endif > > > > #define calloc(n,s) AllocateZeroPool((n)*(s)) > > - > > -#define free(p) \ > > - do { \ > > - VOID *EvalOnce; \ > > - \ > > - EvalOnce = (p); \ > > - if (EvalOnce != NULL) { \ > > - FreePool (EvalOnce); \ > > - } \ > > - } while (FALSE) > > - > > #define xmemmove(Dest,Src,Length) CopyMem(Dest,Src,Length) > > #define xmemcpy(Dest,Src,Length) CopyMem(Dest,Src,Length) > > #define xmemset(Buffer,Value,Length) SetMem(Buffer,Length,Value) > > @@ -98,6 +87,7 @@ void* malloc(size_t size); > void* realloc(void *ptr, size_t size); > > void* memcpy (void *dest, const void *src, unsigned int count); > > void* memset (void *dest, char ch, unsigned int count); > > +void free(void *ptr); > > > > #define exit(n) ASSERT(FALSE); > > > > -- > 2.31.1.windows.1
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#76358): https://edk2.groups.io/g/devel/message/76358 Mute This Topic: https://groups.io/mt/83460434/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-