]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools/VfrCompile:Fix memory leak issues
authorDandan Bi <dandan.bi@intel.com>
Tue, 10 Apr 2018 01:35:32 +0000 (09:35 +0800)
committerLiming Gao <liming.gao@intel.com>
Tue, 17 Apr 2018 08:57:00 +0000 (16:57 +0800)
Cc: Eric Dong <eric.dong@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Dandan Bi <dandan.bi@intel.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
BaseTools/Source/C/VfrCompile/VfrSyntax.g

index d48072a8adf058c362f15d307a9de2ba08a1e5b3..4b0a43606eacb6917d8682798628b3936aecd4a5 100644 (file)
@@ -4105,6 +4105,7 @@ vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :
                                                           }\r
                                                           \r
                                                           if ($RootLevel == 0) {\r
+                                                            _CLEAR_SAVED_OPHDR ();\r
                                                             mCIfrOpHdrIndex --;\r
                                                           }\r
                                                        >>\r
@@ -4389,6 +4390,12 @@ vareqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                        << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
     )\r
   )\r
+  <<\r
+     if (VarIdStr != NULL) {\r
+       delete[] VarIdStr;\r
+       VarIdStr = NULL;\r
+     }\r
+  >>\r
   ;\r
 \r
 ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -4442,6 +4449,12 @@ ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                        << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
     )\r
   )\r
+  <<\r
+     if (VarIdStr != NULL) {\r
+       delete[] VarIdStr;\r
+       VarIdStr = NULL;\r
+     }\r
+  >>\r
   ;\r
 \r
 ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -4494,6 +4507,16 @@ ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                        << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>\r
     )\r
   )\r
+  <<\r
+     if (VarIdStr[0] != NULL) {\r
+       delete[] VarIdStr[0];\r
+       VarIdStr[0] = NULL;\r
+     }\r
+     if (VarIdStr[1] != NULL) {\r
+       delete[] VarIdStr[1];\r
+       VarIdStr[1] = NULL;\r
+     }\r
+  >>\r
   ;\r
 \r
 ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
@@ -4533,6 +4556,10 @@ ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
                                                             }\r
                                                             $ExpOpCount++;\r
                                                           }\r
+                                                          if (VarIdStr != NULL) {\r
+                                                            delete[] VarIdStr;\r
+                                                            VarIdStr = NULL;\r
+                                                          }\r
                                                         >>\r
   ;\r
 \r
@@ -5057,7 +5084,10 @@ EfiVfrParser::_CLEAR_SAVED_OPHDR (
   VOID\r
   )\r
 {\r
-  mCIfrOpHdr[mCIfrOpHdrIndex]       = NULL;\r
+  if (mCIfrOpHdr[mCIfrOpHdrIndex] != NULL) {\r
+    delete mCIfrOpHdr[mCIfrOpHdrIndex];\r
+    mCIfrOpHdr[mCIfrOpHdrIndex]     = NULL;\r
+  }\r
   mCIfrOpHdrLineNo[mCIfrOpHdrIndex] = 0;\r
 }\r
 \r