Cecil,

I had two comments for the first patch, this V2 patch only covers one of the comments.

And one further comment below for this V2 patch.

On 2016/3/17 9:33, Cecil Sheng wrote:
According to UEFI2.6, CapturePtr in the Captures array returned by 
MatchString() should be separatedly allocated so that they can be freed by the 
caller.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Cecil Sheng <[email protected]>
Reviewed-by: Samer El-Haj-Mahmoud <[email protected]>
---
  .../RegularExpressionDxe/RegularExpressionDxe.c    | 33 ++++++++++++++++++----
  1 file changed, 28 insertions(+), 5 deletions(-)

diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c 
b/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c
index cffbcb8..87912c5 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<BR>
+  (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>

    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,8 @@ OnigurumaMatch (
    CHAR8           ErrorMessage[ONIG_MAX_ERROR_MESSAGE_LEN];
    UINT32          Index;
    OnigUChar       *Start;
+  EFI_STATUS      Status;
+

    //
    // Detemine the internal syntax type
@@ -102,7 +104,7 @@ OnigurumaMatch (
      OnigSyntax = ONIG_SYNTAX_PERL;
    } else {
      DEBUG ((DEBUG_ERROR, "Unsupported regex syntax - using default\n"));
-    ASSERT (FALSE);
+    return EFI_UNSUPPORTED;
    }

    //
@@ -143,6 +145,8 @@ OnigurumaMatch (
                   Region,
                   ONIG_OPTION_NONE
                   );
+
+  Status = EFI_SUCCESS;
    if (OnigResult >= 0) {
      *Result = TRUE;
    } else {
@@ -150,6 +154,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 +165,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);

Here, the parameter to FreePool() should be *Captures, right?

Thanks,
Star
        }
      }
    }
@@ -173,7 +196,7 @@ OnigurumaMatch (
    onig_region_free (Region, 1);
    onig_free (OnigRegex);

-  return EFI_SUCCESS;
+  return Status;
  }

  /**


_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to