ArmPkg/Library/ArmDmaLib: Deallocate Map buffer in case of error

The patch is fixing memory leak in case of errors.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Daniil Egranov <daniil.egranov@arm.com>
Tested-by; Ryan Harkin <ryan.harkin@linaro.org>

Style fixes: use goto for error handling, whitespace fixes

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
diff --git a/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c b/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c
index d48d6ff..4476e8b 100644
--- a/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c
+++ b/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c
@@ -90,15 +90,13 @@
     return  EFI_OUT_OF_RESOURCES;

   }

 

-  *Mapping = Map;

-

   if ((((UINTN)HostAddress & (gCacheAlignment - 1)) != 0) ||

       ((*NumberOfBytes & (gCacheAlignment - 1)) != 0)) {

 

     // Get the cacheability of the region

     Status = gDS->GetMemorySpaceDescriptor (*DeviceAddress, &GcdDescriptor);

     if (EFI_ERROR(Status)) {

-      return Status;

+      goto FreeMapInfo;

     }

 

     // If the mapped buffer is not an uncached buffer

@@ -112,7 +110,8 @@
           "%a: Operation type 'MapOperationBusMasterCommonBuffer' is only supported\n"

           "on memory regions that were allocated using DmaAllocateBuffer ()\n",

           __FUNCTION__));

-        return EFI_UNSUPPORTED;

+        Status = EFI_UNSUPPORTED;

+        goto FreeMapInfo;

       }

 

       //

@@ -122,7 +121,7 @@
       Map->DoubleBuffer  = TRUE;

       Status = DmaAllocateBuffer (EfiBootServicesData, EFI_SIZE_TO_PAGES (*NumberOfBytes), &Buffer);

       if (EFI_ERROR (Status)) {

-        return Status;

+        goto FreeMapInfo;

       }

 

       if (Operation == MapOperationBusMasterRead) {

@@ -162,7 +161,14 @@
   Map->NumberOfBytes = *NumberOfBytes;

   Map->Operation     = Operation;

 

+  *Mapping = Map;

+

   return EFI_SUCCESS;

+

+FreeMapInfo:

+  FreePool (Map);

+

+  return Status;

 }