https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68987

            Bug ID: 68987
           Summary: double free or corruption in _gfortran_st_write_done
                    when a write statement to an internal file uses an
                    invalid format and the ERR= specifier appears.
           Product: gcc
           Version: 5.3.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libfortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mathewc at nag dot co.uk
  Target Milestone: ---

I'm using

> gfortran --version
GNU Fortran (GCC) 5.3.1 20151207 (Red Hat 5.3.1-2)

on

> uname -a
Linux cuivienen.nag.co.uk 4.2.7-300.fc23.x86_64 #1 SMP Wed Dec 9 22:28:30 UTC
2015 x86_64 x86_64 x86_64 GNU/Linux

> /lib/libc.so.6
GNU C Library (GNU libc) stable release version 2.22, by Roland McGrath et al.
...
Compiled by GNU CC version 5.1.1 20150618 (Red Hat 5.1.1-4).

and then with

> cat foo.f90 && gfortran foo.f90 && ./a.out
Program foo
  Call s('(foo)')
End Program
Subroutine s(fmt)
  Character (*) :: fmt
  Character (1) :: c
  Integer :: i
  Write (c, fmt, Iostat=i) 42
  If (i==0) Stop 'FAIL1'
  Write (c, fmt, Err=100) 42
  Stop 'FAIL2'
100 Continue
  Print *, 'ok'
End Subroutine
*** Error in `./a.out': double free or corruption (out): 0x0000000001050360 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x77e35)[0x2b46ad0cae35]
/lib64/libc.so.6(+0x8051a)[0x2b46ad0d351a]
/lib64/libc.so.6(cfree+0x4c)[0x2b46ad0d6ccc]
/lib64/libgfortran.so.3(_gfortran_st_write_done+0x7b)[0x2b46ac6bcdab]
./a.out[0x400a0a]
./a.out[0x400a9e]
./a.out[0x400ad5]
/lib64/libc.so.6(__libc_start_main+0xf0)[0x2b46ad073580]
./a.out[0x4007b9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 00:2b 43527338                          
/fserver/mathewc/test_f/a.out
00600000-00601000 r--p 00000000 00:2b 43527338                          
/fserver/mathewc/test_f/a.out
00601000-00602000 rw-p 00001000 00:2b 43527338                          
/fserver/mathewc/test_f/a.out
0104d000-0106e000 rw-p 00000000 00:00 0                                  [heap]
2b46ac3ac000-2b46ac3cd000 r-xp 00000000 fd:01 1315819                   
/usr/lib64/ld-2.22.so
2b46ac3cd000-2b46ac3cf000 rw-p 00000000 00:00 0 
2b46ac3ec000-2b46ac3ef000 rw-p 00000000 00:00 0 
2b46ac5cc000-2b46ac5cd000 r--p 00020000 fd:01 1315819                   
/usr/lib64/ld-2.22.so
2b46ac5cd000-2b46ac5ce000 rw-p 00021000 fd:01 1315819                   
/usr/lib64/ld-2.22.so
2b46ac5ce000-2b46ac5cf000 rw-p 00000000 00:00 0 
2b46ac5cf000-2b46ac6f7000 r-xp 00000000 fd:01 1321356                   
/usr/lib64/libgfortran.so.3.0.0
2b46ac6f7000-2b46ac8f7000 ---p 00128000 fd:01 1321356                   
/usr/lib64/libgfortran.so.3.0.0
2b46ac8f7000-2b46ac8f9000 r--p 00128000 fd:01 1321356                   
/usr/lib64/libgfortran.so.3.0.0
2b46ac8f9000-2b46ac8fb000 rw-p 0012a000 fd:01 1321356                   
/usr/lib64/libgfortran.so.3.0.0
2b46ac8fb000-2b46ac9fc000 r-xp 00000000 fd:01 1321296                   
/usr/lib64/libm-2.22.so
2b46ac9fc000-2b46acbfb000 ---p 00101000 fd:01 1321296                   
/usr/lib64/libm-2.22.so
2b46acbfb000-2b46acbfc000 r--p 00100000 fd:01 1321296                   
/usr/lib64/libm-2.22.so
2b46acbfc000-2b46acbfd000 rw-p 00101000 fd:01 1321296                   
/usr/lib64/libm-2.22.so
2b46acbfd000-2b46acc13000 r-xp 00000000 fd:01 1312410                   
/usr/lib64/libgcc_s-5.3.1-20151207.so.1
2b46acc13000-2b46ace12000 ---p 00016000 fd:01 1312410                   
/usr/lib64/libgcc_s-5.3.1-20151207.so.1
2b46ace12000-2b46ace13000 r--p 00015000 fd:01 1312410                   
/usr/lib64/libgcc_s-5.3.1-20151207.so.1
2b46ace13000-2b46ace14000 rw-p 00016000 fd:01 1312410                   
/usr/lib64/libgcc_s-5.3.1-20151207.so.1
2b46ace14000-2b46ace52000 r-xp 00000000 fd:01 1312475                   
/usr/lib64/libquadmath.so.0.0.0
2b46ace52000-2b46ad051000 ---p 0003e000 fd:01 1312475                   
/usr/lib64/libquadmath.so.0.0.0
2b46ad051000-2b46ad052000 r--p 0003d000 fd:01 1312475                   
/usr/lib64/libquadmath.so.0.0.0
2b46ad052000-2b46ad053000 rw-p 0003e000 fd:01 1312475                   
/usr/lib64/libquadmath.so.0.0.0
2b46ad053000-2b46ad20a000 r-xp 00000000 fd:01 1321289                   
/usr/lib64/libc-2.22.so
2b46ad20a000-2b46ad40a000 ---p 001b7000 fd:01 1321289                   
/usr/lib64/libc-2.22.so
2b46ad40a000-2b46ad40e000 r--p 001b7000 fd:01 1321289                   
/usr/lib64/libc-2.22.so
2b46ad40e000-2b46ad410000 rw-p 001bb000 fd:01 1321289                   
/usr/lib64/libc-2.22.so
2b46ad410000-2b46ad414000 rw-p 00000000 00:00 0 
2b46b0000000-2b46b0021000 rw-p 00000000 00:00 0 
2b46b0021000-2b46b4000000 ---p 00000000 00:00 0 
7ffdd7827000-7ffdd7848000 rw-p 00000000 00:00 0                         
[stack]
7ffdd785d000-7ffdd785f000 r--p 00000000 00:00 0                          [vvar]
7ffdd785f000-7ffdd7861000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                 
[vsyscall]

Program received signal SIGABRT: Process abort signal.

Backtrace for this error:
#0  0x2B46AC5EAD58
#1  0x2B46AC5E9EE0
#2  0x2B46AD087B1F
#3  0x2B46AD087A98
#4  0x2B46AD089699
#5  0x2B46AD0CAE39
#6  0x2B46AD0D3519
#7  0x2B46AD0D6CCB
#8  0x2B46AC6BCDAA
#9  0x400A09 in s_
#10  0x400A9D in MAIN__ at foo.f90:?
Abort (core dumped)

I.e., an invalid Write with Iostat= is OK, but crashes if Err= is used instead.

This used to work with, if I recall, 5.1.1 (which was the previous version
number on my system before a recent upgrade).

Reply via email to