summaryrefslogtreecommitdiff
path: root/BaseTools/Source/C/Common/Decompress.c
diff options
context:
space:
mode:
authorHao Wu <hao.a.wu@intel.com>2016-09-28 11:18:12 +0800
committerHao Wu <hao.a.wu@intel.com>2016-11-08 16:37:28 +0800
commitaee346514d224a90622fe4cc553ba8ae79fe2828 (patch)
tree9820ad9b97859a5e4b83448e293cc4704ce87b5e /BaseTools/Source/C/Common/Decompress.c
parent5e85fb52d0838b15eb8787d08be27b4f9c3f964a (diff)
downloadedk2-platforms-aee346514d224a90622fe4cc553ba8ae79fe2828.tar.xz
BaseTools/C/Common: Fix potential memory leak
Cc: Liming Gao <liming.gao@intel.com> Cc: Yonghong Zhu <yonghong.zhu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
Diffstat (limited to 'BaseTools/Source/C/Common/Decompress.c')
-rw-r--r--BaseTools/Source/C/Common/Decompress.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/BaseTools/Source/C/Common/Decompress.c b/BaseTools/Source/C/Common/Decompress.c
index 77df89ff48..4b83e88210 100644
--- a/BaseTools/Source/C/Common/Decompress.c
+++ b/BaseTools/Source/C/Common/Decompress.c
@@ -934,7 +934,9 @@ Extract (
UINT32 ScratchSize;
EFI_STATUS Status;
- Status = EFI_SUCCESS;
+ Scratch = NULL;
+ Status = EFI_SUCCESS;
+
switch (Algorithm) {
case 0:
*Destination = (VOID *)malloc(SrcSize);
@@ -948,30 +950,44 @@ Extract (
Status = EfiGetInfo(Source, SrcSize, DstSize, &ScratchSize);
if (Status == EFI_SUCCESS) {
Scratch = (VOID *)malloc(ScratchSize);
+ if (Scratch == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
*Destination = (VOID *)malloc(*DstSize);
- if (Scratch != NULL && *Destination != NULL) {
- Status = EfiDecompress(Source, SrcSize, *Destination, *DstSize, Scratch, ScratchSize);
- } else {
- Status = EFI_OUT_OF_RESOURCES;
+ if (*Destination == NULL) {
+ free (Scratch);
+ return EFI_OUT_OF_RESOURCES;
}
+
+ Status = EfiDecompress(Source, SrcSize, *Destination, *DstSize, Scratch, ScratchSize);
}
break;
case 2:
Status = TianoGetInfo(Source, SrcSize, DstSize, &ScratchSize);
if (Status == EFI_SUCCESS) {
Scratch = (VOID *)malloc(ScratchSize);
+ if (Scratch == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
*Destination = (VOID *)malloc(*DstSize);
- if (Scratch != NULL && *Destination != NULL) {
- Status = TianoDecompress(Source, SrcSize, *Destination, *DstSize, Scratch, ScratchSize);
- } else {
- Status = EFI_OUT_OF_RESOURCES;
+ if (*Destination == NULL) {
+ free (Scratch);
+ return EFI_OUT_OF_RESOURCES;
}
+
+ Status = TianoDecompress(Source, SrcSize, *Destination, *DstSize, Scratch, ScratchSize);
}
break;
default:
Status = EFI_INVALID_PARAMETER;
}
+ if (Scratch != NULL) {
+ free (Scratch);
+ }
+
return Status;
}