diff mbox series

[Ada] Guard against access to wrong fields in Is_Renaming

Message ID 20200715134518.GA23710@adacore.com
State New
Headers show
Series [Ada] Guard against access to wrong fields in Is_Renaming | expand

Commit Message

Pierre-Marie de Rodat July 15, 2020, 1:45 p.m. UTC
Renamed_Entity is only valid for a few entities, using it on any entity
passed to Is_Renaming can result in crashes.  Fixing this requires
making sure that Is_Renaming only uses Renamed_Entity on entities where
this is allowed and uses Is_Renaming_Of_Object everywhere else.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

	* sem_util.adb (Is_Renaming): Add ekind checks.
diff mbox series

Patch

diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -6422,8 +6422,28 @@  package body Sem_Util is
 
       function Is_Renaming (N : Node_Id) return Boolean is
       begin
-         return
-           Is_Entity_Name (N) and then Present (Renamed_Entity (Entity (N)));
+         if not Is_Entity_Name (N) then
+            return False;
+         end if;
+
+         case Ekind (Entity (N)) is
+            when E_Variable | E_Constant =>
+               return Present (Renamed_Object (Entity (N)));
+
+            when E_Exception
+               | E_Function
+               | E_Generic_Function
+               | E_Generic_Package
+               | E_Generic_Procedure
+               | E_Operator
+               | E_Package
+               | E_Procedure
+            =>
+               return Present (Renamed_Entity (Entity (N)));
+
+            when others =>
+               return False;
+         end case;
       end Is_Renaming;
 
       -----------------------