]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/Common/Decompress.c
BaseTools/C/Common: Fix potential memory leak
[mirror_edk2.git] / BaseTools / Source / C / Common / Decompress.c
index 77df89ff48cba2a3756578ac7080037d6b927ed0..4b83e88210e14b89ff4ec704f5b6385dcad7c54b 100644 (file)
@@ -934,7 +934,9 @@ Extract (
   UINT32        ScratchSize;\r
   EFI_STATUS    Status;\r
 \r
-  Status = EFI_SUCCESS;\r
+  Scratch = NULL;\r
+  Status  = EFI_SUCCESS;\r
+\r
   switch (Algorithm) {\r
   case 0:\r
     *Destination = (VOID *)malloc(SrcSize);\r
@@ -948,30 +950,44 @@ Extract (
     Status = EfiGetInfo(Source, SrcSize, DstSize, &ScratchSize);\r
     if (Status == EFI_SUCCESS) {\r
       Scratch = (VOID *)malloc(ScratchSize);\r
+      if (Scratch == NULL) {\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+\r
       *Destination = (VOID *)malloc(*DstSize);\r
-      if (Scratch != NULL && *Destination != NULL) {\r
-        Status = EfiDecompress(Source, SrcSize, *Destination, *DstSize, Scratch, ScratchSize);\r
-      } else {\r
-        Status = EFI_OUT_OF_RESOURCES;\r
+      if (*Destination == NULL) {\r
+        free (Scratch);\r
+        return EFI_OUT_OF_RESOURCES;\r
       }\r
+\r
+      Status = EfiDecompress(Source, SrcSize, *Destination, *DstSize, Scratch, ScratchSize);\r
     }\r
     break;\r
   case 2:\r
     Status = TianoGetInfo(Source, SrcSize, DstSize, &ScratchSize);\r
     if (Status == EFI_SUCCESS) {\r
       Scratch = (VOID *)malloc(ScratchSize);\r
+      if (Scratch == NULL) {\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+\r
       *Destination = (VOID *)malloc(*DstSize);\r
-      if (Scratch != NULL && *Destination != NULL) {\r
-        Status = TianoDecompress(Source, SrcSize, *Destination, *DstSize, Scratch, ScratchSize);\r
-      } else {\r
-        Status = EFI_OUT_OF_RESOURCES;\r
+      if (*Destination == NULL) {\r
+        free (Scratch);\r
+        return EFI_OUT_OF_RESOURCES;\r
       }\r
+\r
+      Status = TianoDecompress(Source, SrcSize, *Destination, *DstSize, Scratch, ScratchSize);\r
     }\r
     break;\r
   default:\r
     Status = EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  if (Scratch != NULL) {\r
+    free (Scratch);\r
+  }\r
+\r
   return Status;\r
 }\r
 \r