This patch prevents the copy of too big names to fixed-size buffers from
overflowing. Instead, when too big strings are provided, treat them as
invalid and return an empty string.
The execution of the following example must print "OK":
$ gnatmake foo && ./foo
with Ada.Text_IO; use Ada.Text_IO;
with GNAT.OS_Lib; use GNAT.OS_Lib;
procedure Foo is
Max_Path : Integer;
pragma Import (C, Max_Path, "__gnat_max_path_len");
Valid_Path : String (1 .. Max_Path) :=
(1 => '/', others => 'a');
Invalid_Path : String (1 .. Max_Path + 1) :=
(1 => '/', others => 'a');
begin
if Normalize_Pathname (Valid_Path) /= ""
and then
Normalize_Pathname (Invalid_Path) = ""
then
Put_Line ("OK");
else
Put_Line ("FAIL");
end if;
end Foo;
Tested on x86_64-pc-linux-gnu, committed on trunk
2014-01-29 Pierre-Marie Derodat <[email protected]>
* s-os_lib.adb, s-os_lib.ads (Normalize_Pathname): Return an empty
string when the Name input bigger than allowed. Adapt the function
specification.
Index: s-os_lib.adb
===================================================================
--- s-os_lib.adb (revision 207241)
+++ s-os_lib.adb (working copy)
@@ -1927,9 +1927,10 @@
-- Start of processing for Normalize_Pathname
begin
- -- Special case, if name is null, then return null
+ -- Special case, return null if name is null, or if it is bigger than
+ -- the biggest name allowed.
- if Name'Length = 0 then
+ if Name'Length = 0 or else Name'Length > Max_Path then
return "";
end if;
Index: s-os_lib.ads
===================================================================
--- s-os_lib.ads (revision 207241)
+++ s-os_lib.ads (working copy)
@@ -445,9 +445,10 @@
-- directory pointed to. This is slightly less efficient, since it
-- requires system calls.
--
- -- If Name cannot be resolved or is null on entry (for example if there is
- -- symbolic link circularity, e.g. A is a symbolic link for B, and B is a
- -- symbolic link for A), then Normalize_Pathname returns an empty string.
+ -- If Name cannot be resolved, is invalid (for example if it is too big) or
+ -- is null on entry (for example if there is symbolic link circularity,
+ -- e.g. A is a symbolic link for B, and B is a symbolic link for A), then
+ -- Normalize_Pathname returns an empty string.
--
-- In VMS, if Name follows the VMS syntax file specification, it is first
-- converted into Unix syntax. If the conversion fails, Normalize_Pathname