diff options
author | Philippe Gil <gil@adacore.com> | 2011-08-29 09:30:33 +0000 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2011-08-29 11:30:33 +0200 |
commit | 3e37be71aa737869a2c02a8d041dd63d14d80025 (patch) | |
tree | 9ea8ca204bce1acb4eaa22138aaf1c77875ff9b7 /gcc/ada/prj.adb | |
parent | 94fb7608441bd960315df71ce953d9a88a9f74a3 (diff) | |
download | gcc-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.adb | 38 |
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; |