BaseTools/VfrCompile: Avoid freeing memory with mismatched functions

Memory allocated by operator new[] should be freed using delete[] to avoid
possible memory leak.

Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Dandan Bi <dandan.bi@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>
This commit is contained in:
Hao Wu 2016-09-27 13:40:58 +08:00
parent a6ac965bca
commit fd5425230e
5 changed files with 22 additions and 20 deletions

View File

@ -677,7 +677,7 @@ CVfrCompiler::PreProcess (
goto Fail; goto Fail;
} }
delete PreProcessCmd; delete[] PreProcessCmd;
Out: Out:
SET_RUN_STATUS (STATUS_PREPROCESSED); SET_RUN_STATUS (STATUS_PREPROCESSED);
@ -687,7 +687,7 @@ Fail:
if (!IS_RUN_STATUS(STATUS_DEAD)) { if (!IS_RUN_STATUS(STATUS_DEAD)) {
SET_RUN_STATUS (STATUS_FAILED); SET_RUN_STATUS (STATUS_FAILED);
} }
delete PreProcessCmd; delete[] PreProcessCmd;
} }
extern UINT8 VfrParserStart (IN FILE *, IN INPUT_INFO_TO_SYNTAX *); extern UINT8 VfrParserStart (IN FILE *, IN INPUT_INFO_TO_SYNTAX *);

View File

@ -2,7 +2,7 @@
VfrCompiler error handler. VfrCompiler error handler.
Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR> Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at which accompanies this distribution. The full text of the license may be found at
@ -145,7 +145,7 @@ SVfrFileScopeRecord::~SVfrFileScopeRecord (
) )
{ {
if (mFileName != NULL) { if (mFileName != NULL) {
delete mFileName; delete[] mFileName;
} }
} }

View File

@ -56,13 +56,13 @@ SPendingAssign::~SPendingAssign (
) )
{ {
if (mKey != NULL) { if (mKey != NULL) {
delete mKey; delete[] mKey;
} }
mAddr = NULL; mAddr = NULL;
mLen = 0; mLen = 0;
mLineNo = 0; mLineNo = 0;
if (mMsg != NULL) { if (mMsg != NULL) {
delete mMsg; delete[] mMsg;
} }
mNext = NULL; mNext = NULL;
} }
@ -898,7 +898,7 @@ CFormPkg::DeclarePendingQuestion (
strcpy (NewStr, SName); strcpy (NewStr, SName);
strcat (NewStr, VarStr + strlen (FName)); strcat (NewStr, VarStr + strlen (FName));
ReturnCode = lCVfrVarDataTypeDB.GetDataFieldInfo (NewStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize); ReturnCode = lCVfrVarDataTypeDB.GetDataFieldInfo (NewStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize);
delete NewStr; delete[] NewStr;
} }
} else { } else {
ReturnCode = VFR_RETURN_UNSUPPORTED; ReturnCode = VFR_RETURN_UNSUPPORTED;

View File

@ -123,7 +123,7 @@ SConfigInfo::~SConfigInfo (
VOID VOID
) )
{ {
BUFFER_SAFE_FREE (mValue); ARRAY_SAFE_FREE (mValue);
} }
SConfigItem::SConfigItem ( SConfigItem::SConfigItem (
@ -200,9 +200,9 @@ SConfigItem::~SConfigItem (
{ {
SConfigInfo *Info; SConfigInfo *Info;
BUFFER_SAFE_FREE (mName); ARRAY_SAFE_FREE (mName);
BUFFER_SAFE_FREE (mGuid); ARRAY_SAFE_FREE (mGuid);
BUFFER_SAFE_FREE (mId); ARRAY_SAFE_FREE (mId);
while (mInfoStrList != NULL) { while (mInfoStrList != NULL) {
Info = mInfoStrList; Info = mInfoStrList;
mInfoStrList = mInfoStrList->mNext; mInfoStrList = mInfoStrList->mNext;
@ -1393,7 +1393,7 @@ SVfrVarStorageNode::~SVfrVarStorageNode (
) )
{ {
if (mVarStoreName != NULL) { if (mVarStoreName != NULL) {
delete mVarStoreName; delete[] mVarStoreName;
} }
if (mVarStoreType == EFI_VFR_VARSTORE_NAME) { if (mVarStoreType == EFI_VFR_VARSTORE_NAME) {
@ -2102,7 +2102,7 @@ SVfrDefaultStoreNode::~SVfrDefaultStoreNode (
) )
{ {
if (mRefName != NULL) { if (mRefName != NULL) {
delete mRefName; delete[] mRefName;
} }
} }
@ -2304,7 +2304,7 @@ SVfrRuleNode::~SVfrRuleNode (
) )
{ {
if (mRuleName != NULL) { if (mRuleName != NULL) {
delete mRuleName; delete[] mRuleName;
} }
} }
@ -2523,11 +2523,11 @@ SVfrQuestionNode::~SVfrQuestionNode (
) )
{ {
if (mName != NULL) { if (mName != NULL) {
delete mName; delete[] mName;
} }
if (mVarIdStr != NULL) { if (mVarIdStr != NULL) {
delete mVarIdStr; delete[] mVarIdStr;
} }
} }
@ -3387,7 +3387,7 @@ CVfrStringDB::GetVarStoreNameFormStringId (
// Check the String package. // Check the String package.
// //
if (PkgHeader->Header.Type != EFI_HII_PACKAGE_STRINGS) { if (PkgHeader->Header.Type != EFI_HII_PACKAGE_STRINGS) {
delete StringPtr; delete[] StringPtr;
return NULL; return NULL;
} }
@ -3414,7 +3414,7 @@ CVfrStringDB::GetVarStoreNameFormStringId (
// //
Status = FindStringBlock(Current, StringId, &NameOffset, &BlockType); Status = FindStringBlock(Current, StringId, &NameOffset, &BlockType);
if (Status != EFI_SUCCESS) { if (Status != EFI_SUCCESS) {
delete StringPtr; delete[] StringPtr;
return NULL; return NULL;
} }
@ -3447,7 +3447,7 @@ CVfrStringDB::GetVarStoreNameFormStringId (
break; break;
} }
delete StringPtr; delete[] StringPtr;
return VarStoreName; return VarStoreName;
} }

View File

@ -33,6 +33,8 @@ extern BOOLEAN VfrCompatibleMode;
#define EFI_BITS_PER_UINT32 (1 << EFI_BITS_SHIFT_PER_UINT32) #define EFI_BITS_PER_UINT32 (1 << EFI_BITS_SHIFT_PER_UINT32)
#define BUFFER_SAFE_FREE(Buf) do { if ((Buf) != NULL) { delete (Buf); } } while (0); #define BUFFER_SAFE_FREE(Buf) do { if ((Buf) != NULL) { delete (Buf); } } while (0);
#define ARRAY_SAFE_FREE(Buf) do { if ((Buf) != NULL) { delete[] (Buf); } } while (0);
class CVfrBinaryOutput { class CVfrBinaryOutput {
public: public:
@ -139,7 +141,7 @@ struct SVfrPackStackNode {
~SVfrPackStackNode (VOID) { ~SVfrPackStackNode (VOID) {
if (mIdentifier != NULL) { if (mIdentifier != NULL) {
delete mIdentifier; delete[] mIdentifier;
} }
mNext = NULL; mNext = NULL;
} }