Răsfoiți Sursa

* when parsing unions, set the uniondef reference to nil in
current_module.deflist after freeing the object to prevent dangling pointers
and use after free

git-svn-id: trunk@48986 -

nickysn 4 ani în urmă
părinte
comite
811cf381ad
1 a modificat fișierele cu 5 adăugiri și 0 ștergeri
  1. 5 0
      compiler/pdecvar.pas

+ 5 - 0
compiler/pdecvar.pas

@@ -1633,6 +1633,7 @@ implementation
          is_first_type: boolean;
 {$endif powerpc or powerpc64}
          old_block_type: tblock_type;
+         tmpidx: Integer;
       begin
          old_block_type:=block_type;
          block_type:=bt_var;
@@ -2003,6 +2004,10 @@ implementation
 
               trecordsymtable(recst).insertunionst(Unionsymtable,offset);
               uniondef.owner.deletedef(uniondef);
+              { this prevents a dangling pointer and use after free }
+              tmpidx:=current_module.deflist.IndexOfItem(uniondef,FromEnd);
+              if tmpidx<>-1 then
+                current_module.deflist[tmpidx]:=nil;
            end;
          { free the list }
          sc.free;