On 02/25/16 09:56, Shia, Cinnamon wrote: > Reviewed-By: Cinnamon Shia <[email protected]>
Thanks, but actually I noticed an error in this patch: > -----Original Message----- > From: Laszlo Ersek [mailto:[email protected]] > Sent: Thursday, February 25, 2016 5:14 AM > To: edk2-devel-01 > Cc: Sheng, Cecil (HPS SW); Shia, Cinnamon; Eric Dong; Qiu Shumin; > El-Haj-Mahmoud, Samer; Yao Jiewen > Subject: [PATCH 4/4] MdeModulePkg: RegularExpressionDxe: support free(NULL) > > The ISO C standard says about free(), > > If ptr is a null pointer, no action occurs. > > This is not true of the FreePool() interface of the MemoryAllocationLib > class: > > Buffer must have been allocated on a previous call to the pool > allocation services of the Memory Allocation Library. [...] If Buffer > was not allocated with a pool allocation function in the Memory > Allocation Library, then ASSERT(). > > Therefore we must not forward the argument of free() to FreePool() without > checking. > > Cc: Cecil Sheng <[email protected]> > Cc: Cinnamon Shia <[email protected]> > Cc: Eric Dong <[email protected]> > Cc: Qiu Shumin <[email protected]> > Cc: Samer El-Haj-Mahmoud <[email protected]> > Cc: Yao Jiewen <[email protected]> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Laszlo Ersek <[email protected]> > --- > > Notes: > Build-tested only. > > MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaUefiPort.h | > 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git > a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaUefiPort.h > b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaUefiPort.h > index cb791f8c84c6..b970aaa48c0e 100644 > --- > a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaUefiPort.h > +++ > b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaUefiPort.h > @@ -30,7 +30,17 @@ typedef UINTN size_t; > > #define malloc(n) AllocatePool(n) > #define calloc(n,s) AllocateZeroPool((n)*(s)) > -#define free(p) FreePool(p) > + > +#define free(p) \ > + do { \ > + VOID *EvalOnce; \ > + \ > + EvalOnce = (VOID *)(p); \ the explicit cast to (VOID *) is an error here. I think I was simply too tired when I wrote this patch last night. The explicit (VOID *) cast will *incorrectly* suppress errors that a direct call to FreePool() or free() would report. Consider the following example: STATIC CONST CHAR8 MyString[] = "Hello World"; CONST VOID *MyPointer; MyPointer = MyString; // valid FreePool (MyPointer); // invalid, but caught by the compiler! The pre-patch macro definition will catch this -- the compiler will report a warning (usually treated as an error) that the pointer conversion (implicit in passing the argument to FreePool(), which takes a (VOID *)) throws away the CONST qualifier. Whereas the modified macro definition will silently suppress that. So, I will go ahead and commit patches 1-3 in this series, with Qin Long's R-b; but I will submit a new version of this patch separately. Thanks, and sorry for the churn. Laszlo > + if (EvalOnce != NULL) { \ > + FreePool (EvalOnce); \ > + } \ > + } while (FALSE) > + > #define realloc(OldPtr,NewSize,OldSize) > ReallocatePool(OldSize,NewSize,OldPtr) > #define xmemmove(Dest,Src,Length) CopyMem(Dest,Src,Length) > #define xmemcpy(Dest,Src,Length) CopyMem(Dest,Src,Length) > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

