From 8eb0100871d840172febe46ef192cf1d5e50b50f Mon Sep 17 00:00:00 2001
From: guerby <guerby@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Sat, 16 Apr 2005 07:21:58 +0000
Subject: [PATCH] 2005-04-16  Laurent GUERBY  <laurent@guerby.net>

        PR ada/18847
        * a-nudira.adb (Value): Check for valid string.
        * a-nuflra.adb (Value): Likewise.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@98223 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ada/ChangeLog    |  6 ++++++
 gcc/ada/a-nudira.adb | 15 ++++++++++++---
 gcc/ada/a-nuflra.adb | 21 +++++++++++++++++----
 3 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 8c378752ea6b..06bf37bbea8b 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+2005-04-16  Laurent GUERBY  <laurent@guerby.net>
+
+        PR ada/18847
+        * a-nudira.adb (Value): Check for valid string.
+        * a-nuflra.adb (Value): Likewise.
+
 2005-04-11  Richard Sandiford  <rsandifo@redhat.com>
 
 	* lang.opt: Refer to the GCC internals documentation instead of c.opt.
diff --git a/gcc/ada/a-nudira.adb b/gcc/ada/a-nudira.adb
index f3ef91afdf6a..1b91d890b9a1 100644
--- a/gcc/ada/a-nudira.adb
+++ b/gcc/ada/a-nudira.adb
@@ -229,25 +229,34 @@ package body Ada.Numerics.Discrete_Random is
    -----------
 
    function Value (Coded_State : String) return State is
+      Last  : constant Natural := Coded_State'Last;
       Start : Positive := Coded_State'First;
       Stop  : Positive := Coded_State'First;
       Outs  : State;
 
    begin
-      while Coded_State (Stop) /= ',' loop
+      while Stop <= Last and then Coded_State (Stop) /= ',' loop
          Stop := Stop + 1;
       end loop;
 
+      if Stop > Last then
+         raise Constraint_Error;
+      end if;
+
       Outs.X1 := Int'Value (Coded_State (Start .. Stop - 1));
       Start := Stop + 1;
 
       loop
          Stop := Stop + 1;
-         exit when Coded_State (Stop) = ',';
+         exit when Stop > Last or else Coded_State (Stop) = ',';
       end loop;
 
+      if Stop > Last then
+         raise Constraint_Error;
+      end if;
+
       Outs.X2  := Int'Value (Coded_State (Start .. Stop - 1));
-      Outs.Q   := Int'Value (Coded_State (Stop + 1 .. Coded_State'Last));
+      Outs.Q   := Int'Value (Coded_State (Stop + 1 .. Last));
       Outs.P   := Outs.Q * 2 + 1;
       Outs.FP  := Flt (Outs.P);
       Outs.Scl := (RstL - RstF + 1.0) / (Flt (Outs.P) * Flt (Outs.Q));
diff --git a/gcc/ada/a-nuflra.adb b/gcc/ada/a-nuflra.adb
index 14d74593af0f..70b90b89bb0a 100644
--- a/gcc/ada/a-nuflra.adb
+++ b/gcc/ada/a-nuflra.adb
@@ -256,33 +256,46 @@ package body Ada.Numerics.Float_Random is
    -----------
 
    function Value (Coded_State : String) return State is
+      Last  : constant Natural := Coded_State'Last;
       Start : Positive := Coded_State'First;
       Stop  : Positive := Coded_State'First;
       Outs  : State;
 
    begin
-      while Coded_State (Stop) /= ',' loop
+      while Stop <= Last and then Coded_State (Stop) /= ',' loop
          Stop := Stop + 1;
       end loop;
 
+      if Stop > Last then
+         raise Constraint_Error;
+      end if;
+
       Outs.X1 := Int'Value (Coded_State (Start .. Stop - 1));
       Start := Stop + 1;
 
       loop
          Stop := Stop + 1;
-         exit when Coded_State (Stop) = ',';
+         exit when Stop > Last or else Coded_State (Stop) = ',';
       end loop;
 
+      if Stop > Last then
+         raise Constraint_Error;
+      end if;
+
       Outs.X2 := Int'Value (Coded_State (Start .. Stop - 1));
       Start := Stop + 1;
 
       loop
          Stop := Stop + 1;
-         exit when Coded_State (Stop) = ',';
+         exit when Stop > Last or else Coded_State (Stop) = ',';
       end loop;
 
+      if Stop > Last then
+         raise Constraint_Error;
+      end if;
+
       Outs.P   := Int'Value (Coded_State (Start .. Stop - 1));
-      Outs.Q   := Int'Value (Coded_State (Stop + 1 .. Coded_State'Last));
+      Outs.Q   := Int'Value (Coded_State (Stop + 1 .. Last));
       Outs.X   := Euclid (Outs.P, Outs.Q);
       Outs.Scl := 1.0 / (Flt (Outs.P) * Flt (Outs.Q));
 
-- 
GitLab