[Ada] Avoid buffer overflow in Long_Long_Float_Text_IO
authorSteve Baird <baird@adacore.com>
Sat, 18 Jan 2020 06:10:13 +0000 (22:10 -0800)
committerPierre-Marie de Rodat <derodat@adacore.com>
Thu, 4 Jun 2020 09:10:59 +0000 (05:10 -0400)
2020-06-04  Steve Baird  <baird@adacore.com>

gcc/ada/

* libgnat/s-imgrea.ads: Declare a named number
Max_Real_Image_Length with value 5200.  Provide a comment
explaining why this value was chosen.
* libgnat/s-imgrea.adb (Set_Image_Real): Increase the upper
bound of the local String variable Digs to
Max_Real_Image_Length.
* libgnat/a-tiflau.adb (Put): Increase the upper bound of the
local String variable Buf to Max_Real_Image_Length.
(Puts): Increase the upper bound of the local String variable
Buf to Max_Real_Image_Length.

gcc/ada/libgnat/a-tiflau.adb
gcc/ada/libgnat/s-imgrea.adb
gcc/ada/libgnat/s-imgrea.ads

index 25d78ca88844f9e6bed1fd8ba3a2db9274b05a4d..214b5c8f2c3c4bf697b0cd383205527ebfa7a042 100644 (file)
@@ -194,7 +194,7 @@ package body Ada.Text_IO.Float_Aux is
       Aft  : Field;
       Exp  : Field)
    is
-      Buf : String (1 .. 3 * Field'Last + 2);
+      Buf : String (1 .. Max_Real_Image_Length);
       Ptr : Natural := 0;
 
    begin
@@ -212,7 +212,7 @@ package body Ada.Text_IO.Float_Aux is
       Aft  : Field;
       Exp  : Field)
    is
-      Buf : String (1 .. 3 * Field'Last + 2);
+      Buf : String (1 .. Max_Real_Image_Length);
       Ptr : Natural := 0;
 
    begin
index 642724b3af7d4b2e9693c126687c8ee19fc924b2..68b1fdc6ffdb1a02cb5cdb4434f75c0426f8e67a 100644 (file)
@@ -151,14 +151,9 @@ package body System.Img_Real is
       Scale : Integer;
       Expon : Integer;
 
-      Field_Max : constant := 255;
-      --  This should be the same value as Ada.[Wide_]Text_IO.Field'Last.
-      --  It is not worth dragging in Ada.Text_IO to pick up this value,
-      --  since it really should never be necessary to change it.
-
-      Digs : String (1 .. 2 * Field_Max + 16);
-      --  Array used to hold digits of converted integer value. This is a
-      --  large enough buffer to accommodate ludicrous values of Fore and Aft.
+      Digs : String (1 .. Max_Real_Image_Length);
+      --  Array used to hold digits of converted integer value. This is a large
+      --  enough buffer to accommodate ludicrous Fore/Aft/Exp combinations.
 
       Ndigs : Natural;
       --  Number of digits stored in Digs (and also subscript of last digit)
index 8adb62306451c9ec400847ae625c57b6d96a6d52..9711516164c5bf1e866dd9e2a31649e8f639703b 100644 (file)
@@ -73,4 +73,9 @@ package System.Img_Real is
    --  can be set to any valid values for the case of use from Text_IO. Note
    --  that no space is stored at the start for non-negative values.
 
+   Max_Real_Image_Length : constant := 5200;
+   --   If Exp is set to zero and Aft is set to Text_IO.Field'Last (i.e., 255)
+   --   then Long_Long_Float'Last generates an image whose length is
+   --   slightly less than 5200.
+
 end System.Img_Real;