aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/prj.adb
diff options
context:
space:
mode:
authorPhilippe Gil <gil@adacore.com>2011-08-29 09:30:33 +0000
committerArnaud Charlet <charlet@gcc.gnu.org>2011-08-29 11:30:33 +0200
commit3e37be71aa737869a2c02a8d041dd63d14d80025 (patch)
tree9ea8ca204bce1acb4eaa22138aaf1c77875ff9b7 /gcc/ada/prj.adb
parent94fb7608441bd960315df71ce953d9a88a9f74a3 (diff)
downloadgcc-3e37be71aa737869a2c02a8d041dd63d14d80025.zip
gcc-3e37be71aa737869a2c02a8d041dd63d14d80025.tar.gz
gcc-3e37be71aa737869a2c02a8d041dd63d14d80025.tar.bz2
prj.adb (Reset_Units_In_Table): New procedure.
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
Diffstat (limited to 'gcc/ada/prj.adb')
-rw-r--r--gcc/ada/prj.adb38
1 files changed, 32 insertions, 6 deletions
diff --git a/gcc/ada/prj.adb b/gcc/ada/prj.adb
index e69d529..e68b187 100644
--- a/gcc/ada/prj.adb
+++ b/gcc/ada/prj.adb
@@ -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;