prj.adb (Reset_Units_In_Table): New procedure.
authorPhilippe Gil <gil@adacore.com>
Mon, 29 Aug 2011 09:30:33 +0000 (09:30 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 29 Aug 2011 09:30:33 +0000 (11:30 +0200)
2011-08-29  Philippe Gil  <gil@adacore.com>

* prj.adb (Reset_Units_In_Table): New procedure.
Reset units to avoid access to freed memory.

From-SVN: r178178

gcc/ada/ChangeLog
gcc/ada/prj.adb

index fffc645326ec0f57d20783cb8bc8244d5dde60a5..b28557c68be28e799804ac4ce568a880703bfdf0 100644 (file)
@@ -1,3 +1,8 @@
+2011-08-29  Philippe Gil  <gil@adacore.com>
+
+       * prj.adb (Reset_Units_In_Table): New procedure.
+       Reset units to avoid access to freed memory.
+
 2011-08-29  Thomas Quinot  <quinot@adacore.com>
 
        * get_scos.adb: When reading a P statement SCO without a pragma name
index e69d52975ce5e56cee6b790c7ad407224a219a29..e68b18786d536358f30ab40e20008ae7ffe10b3a 100644 (file)
@@ -71,6 +71,10 @@ package body Prj is
    procedure Free_List (Languages : in out Language_List);
    --  Free memory allocated for the list of languages or sources
 
+   procedure Reset_Units_In_Table (Table : in out Units_Htable.Instance);
+   --  reset to No_Unit_Index Unit.File_Names (Spec).Unit &
+   --  Unit.File_Names (Impl).Unit for all Unis of the Table
+
    procedure Free_Units (Table : in out Units_Htable.Instance);
    --  Free memory allocated for unit information in the project
 
@@ -941,6 +945,29 @@ package body Prj is
       end loop;
    end Free_List;
 
+   --------------------------
+   -- Reset_Units_In_Table --
+   --------------------------
+
+   procedure Reset_Units_In_Table (Table : in out Units_Htable.Instance) is
+      Unit : Unit_Index;
+
+   begin
+      Unit := Units_Htable.Get_First (Table);
+      while Unit /= No_Unit_Index loop
+         if Unit.File_Names (Spec) /= null then
+            Unit.File_Names (Spec).Unit := No_Unit_Index;
+         end if;
+
+         if Unit.File_Names (Impl) /= null then
+            Unit.File_Names (Impl).Unit := No_Unit_Index;
+         end if;
+
+         Unit := Units_Htable.Get_Next (Table);
+      end loop;
+
+   end Reset_Units_In_Table;
+
    ----------------
    -- Free_Units --
    ----------------
@@ -954,13 +981,10 @@ package body Prj is
    begin
       Unit := Units_Htable.Get_First (Table);
       while Unit /= No_Unit_Index loop
-         if Unit.File_Names (Spec) /= null then
-            Unit.File_Names (Spec).Unit := No_Unit_Index;
-         end if;
 
-         if Unit.File_Names (Impl) /= null then
-            Unit.File_Names (Impl).Unit := No_Unit_Index;
-         end if;
+         --  we cannot reset Unit.File_Names (Impl or Spec).Unit here as
+         --  Source_Data buffer is freed by the following instruction
+         --  Free_List (Tree.Projects, Free_Project => True);
 
          Unchecked_Free (Unit);
          Unit := Units_Htable.Get_Next (Table);
@@ -1003,6 +1027,7 @@ package body Prj is
          Source_Paths_Htable.Reset (Tree.Source_Paths_HT);
          Source_Files_Htable.Reset (Tree.Source_Files_HT);
 
+         Reset_Units_In_Table (Tree.Units_HT);
          Free_List (Tree.Projects, Free_Project => True);
          Free_Units (Tree.Units_HT);
 
@@ -1048,6 +1073,7 @@ package body Prj is
 
       Tree.Replaced_Source_Number := 0;
 
+      Reset_Units_In_Table (Tree.Units_HT);
       Free_List (Tree.Projects, Free_Project => True);
       Free_Units (Tree.Units_HT);
    end Reset;