浏览代码

* prevention of dangling pointers and use after free after free_unregistered_localsymtable_elements

git-svn-id: trunk@49262 -
nickysn 4 年之前
父节点
当前提交
1a71ca4106
共有 1 个文件被更改,包括 5 次插入0 次删除
  1. 5 0
      compiler/pmodules.pas

+ 5 - 0
compiler/pmodules.pas

@@ -614,6 +614,7 @@ implementation
         i: longint;
         def: tdef;
         sym: tsym;
+        tmpidx: Integer;
       begin
         for i:=current_module.localsymtable.deflist.count-1 downto 0 do
           begin
@@ -633,6 +634,10 @@ implementation
                    tprocdef(def).procsym.is_registered then
                  tprocsym(tprocdef(def).procsym).ProcdefList.Remove(def);
                 current_module.localsymtable.deletedef(def);
+                { this prevents a dangling pointer and use after free }
+                tmpidx:=current_module.deflist.IndexOfItem(def,FromEnd);
+                if tmpidx<>-1 then
+                  current_module.deflist[tmpidx]:=nil;
               end;
           end;
         { from high to low so we hopefully have moves of less data }