On Tue, Sep 16, 2014 at 11:17 AM, FX <fxcoud...@gmail.com> wrote:
>>> 2014-09-05  Janne Blomqvist  <j...@gcc.gnu.org>
>>>
>>>    PR libfortran/62768
>>>    * io/io.h (gfc_unit): Store C string for the filename.
>>>    * io/close.c (st_close): Use gfc_unit.filename.
>>>    * io/inquire.c (inquire_via_unit): Likewise.
>>>    * io/open.c (new_unit): Likewise.
>>>    (already_open): Likewise, unlink file before freeing filename.
>>>    * io/unit.c (init_units): Likewise.
>>>    (close_unit_1): Likewise.
>>>    (filename_from_unit): Likewise.
>>>    * io/unix.c (compare_file_filename): Likewise.
>>>    (find_file0): Likewise.
>>>    (delete_file): Likewise.
>
> OK, if you add a runtime testcase.

Thanks for the review, committed as r215307. I added the testcase
below as gfortran.dg/filename_null.f90:

! { dg-do run }
! PR 62768
! Filenames with embedded NULL characters are truncated, make sure
! inquire reports the correct truncated name.
program filename_null
  implicit none
  character(len=15), parameter :: s = "hello" // achar(0) // "world", &
       s2 = "hello"
  character(len=15) :: r
  logical :: l
  open(10, file=s)
  inquire(unit=10, name=r)
  if (r /= s2) call abort()
  inquire(file=s2, exist=l)
  if (.not. l) call abort()
  close(10, status="delete")
end program filename_null


> I tried to think of other characters we might want to sanitize/special case, 
> but at least on Unix/POSIX only NUL and / are fundamentally different. It 
> might make sense to think about it for Windows targets.

IIRC on Windows only printable UTF-16 characters are allowed, and like
POSIX NULL and / are special. Anyway, if one does something which is
not allowed, the OS api's should report an error. The bug I fixed was
fundamentally about OS api's expecting null-terminated C strings, so
the strings were truncated in the Fortran->C string conversion before
calling the OS API's.

-- 
Janne Blomqvist

Reply via email to