From 3e37be71aa737869a2c02a8d041dd63d14d80025 Mon Sep 17 00:00:00 2001 From: Philippe Gil Date: Mon, 29 Aug 2011 09:30:33 +0000 Subject: [PATCH] prj.adb (Reset_Units_In_Table): New procedure. 2011-08-29 Philippe Gil * prj.adb (Reset_Units_In_Table): New procedure. Reset units to avoid access to freed memory. From-SVN: r178178 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/prj.adb | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index fffc645326e..b28557c68be 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2011-08-29 Philippe Gil + + * prj.adb (Reset_Units_In_Table): New procedure. + Reset units to avoid access to freed memory. + 2011-08-29 Thomas Quinot * get_scos.adb: When reading a P statement SCO without a pragma name diff --git a/gcc/ada/prj.adb b/gcc/ada/prj.adb index e69d52975ce..e68b18786d5 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; -- 2.30.2