diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c b/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c
index cffbcb834a..a5ee7d52fd 100644
--- a/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c
+++ b/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c
@@ -2,7 +2,7 @@
EFI_REGULAR_EXPRESSION_PROTOCOL Implementation
- (C) Copyright 2015 Hewlett Packard Enterprise Development LP
+ (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP
This program and the accompanying materials are licensed and made available
under the terms and conditions of the BSD License that accompanies this
@@ -91,6 +91,10 @@ OnigurumaMatch (
CHAR8 ErrorMessage[ONIG_MAX_ERROR_MESSAGE_LEN];
UINT32 Index;
OnigUChar *Start;
+ EFI_STATUS Status;
+
+
+ Status = EFI_SUCCESS;
//
// Detemine the internal syntax type
@@ -102,7 +106,7 @@ OnigurumaMatch (
OnigSyntax = ONIG_SYNTAX_PERL;
} else {
DEBUG ((DEBUG_ERROR, "Unsupported regex syntax - using default\n"));
- ASSERT (FALSE);
+ return EFI_UNSUPPORTED;
}
//
@@ -143,6 +147,7 @@ OnigurumaMatch (
Region,
ONIG_OPTION_NONE
);
+
if (OnigResult >= 0) {
*Result = TRUE;
} else {
@@ -150,6 +155,9 @@ OnigurumaMatch (
if (OnigResult != ONIG_MISMATCH) {
onig_error_code_to_str (ErrorMessage, OnigResult);
DEBUG ((DEBUG_ERROR, "Regex match failed: %a\n", ErrorMessage));
+ onig_region_free (Region, 1);
+ onig_free (OnigRegex);
+ return EFI_DEVICE_ERROR;
}
}
@@ -158,14 +166,30 @@ OnigurumaMatch (
//
if (*Result && Captures != NULL) {
*CapturesCount = Region->num_regs;
- *Captures = AllocatePool (*CapturesCount * sizeof(**Captures));
+ *Captures = AllocateZeroPool (*CapturesCount * sizeof(**Captures));
if (*Captures != NULL) {
for (Index = 0; Index < *CapturesCount; ++Index) {
//
// Region beg/end values represent bytes, not characters
//
- (*Captures)[Index].CapturePtr = (CHAR16*)((UINTN)String + Region->beg[Index]);
(*Captures)[Index].Length = (Region->end[Index] - Region->beg[Index]) / sizeof(CHAR16);
+ (*Captures)[Index].CapturePtr = AllocateCopyPool (
+ ((*Captures)[Index].Length) * sizeof (CHAR16),
+ (CHAR16*)((UINTN)String + Region->beg[Index])
+ );
+ if ((*Captures)[Index].CapturePtr == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ break;
+ }
+ }
+
+ if (EFI_ERROR (Status)) {
+ for (Index = 0; Index < *CapturesCount; ++Index) {
+ if ((*Captures)[Index].CapturePtr != NULL) {
+ FreePool ((CHAR16*)(*Captures)[Index].CapturePtr);
+ }
+ }
+ FreePool (*Captures);
}
}
}
@@ -173,7 +197,7 @@ OnigurumaMatch (
onig_region_free (Region, 1);
onig_free (OnigRegex);
- return EFI_SUCCESS;
+ return Status;
}
/**