re PR libfortran/16908 (Segfault in libgfortran/io/transfer.c)

2004-08-21  Bud Davis  <bdavis9659@comcast.net>

	PR 16908
	* io/transfer.c (next_record_w): Do not blank pad.
	* io/transfer.c (next_record): Take into account partial records.
testsuite/
	* gfortran.dg/direct_io.f90: New test.

From-SVN: r86361
This commit is contained in:
Bud Davis 2004-08-21 11:20:29 +00:00 committed by Paul Brook
parent be2043db43
commit 0fa1b65cad
4 changed files with 54 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2004-08-21 Bud Davis <bdavis9659@comcast.net>
PR 16908
* gfortran.dg/direct_io.f90: New test.
2004-08-20 Mark Mitchell <mark@codesourcery.com>
PR c++/17121

View File

@ -0,0 +1,31 @@
! PR 16908
! Segfaulted on second set of writes. We weren't handling partial records
! properly when calculating the file position.
program direct_io_1
implicit none
integer n, nt, mt, m
real dt, tm, w
real, allocatable :: p(:)
nt = 2049 ! if nt < 2049, then everything works.
allocate(p(nt))
p = 0.e0
inquire(iolength=mt) (p(m), m=1, nt)
open(unit=12, file='syn.sax', access='direct', recl=mt)
n = 1
write(12, rec=n) mt, nt
write(12, rec=n+1) (p(m), m=1, nt)
close(12)
inquire(iolength=mt) (p(m), m=1, nt)
open(unit=12, file='syn.sax', access='direct', recl=mt)
n = 1
write(12, rec=n) mt, nt
write(12, rec=n+1) (p(m), m=1, nt)
close(12)
end program

View File

@ -1,3 +1,9 @@
2004-08-21 Bud Davis <bdavis9659@comcast.net>
PR 16908
* io/transfer.c (next_record_w): Do not blank pad.
* io/transfer.c (next_record): Take into account partial records.
2004-08-18 Victor Leikehman <lei@il.ibm.com>
PR fortran/13278

View File

@ -1223,20 +1223,23 @@ next_record_w (int done)
switch (current_mode ())
{
case FORMATTED_DIRECT:
case UNFORMATTED_DIRECT:
if (current_unit->bytes_left == 0)
break;
length = current_unit->bytes_left;
p = salloc_w (current_unit->s, &length);
if (p == NULL)
goto io_error;
memset (p, ' ', current_unit->bytes_left);
if (sfree (current_unit->s) == FAILURE)
goto io_error;
break;
case UNFORMATTED_DIRECT:
if (sfree (current_unit->s) == FAILURE)
goto io_error;
break;
case UNFORMATTED_SEQUENTIAL:
@ -1304,6 +1307,7 @@ next_record_w (int done)
void
next_record (int done)
{
gfc_offset fp; /* file position */
current_unit->read_bad = 0;
@ -1314,8 +1318,12 @@ next_record (int done)
current_unit->current_record = 0;
if (current_unit->flags.access == ACCESS_DIRECT)
current_unit->last_record = file_position (current_unit->s)
/ current_unit->recl;
{
fp = file_position (current_unit->s);
/* Calculate next record, rounding up partial records. */
current_unit->last_record = (fp + curren_unit->recl - 1)
/ current_unit->recl;
}
else
current_unit->last_record++;