Skip to content

Commit 5a0508c

Browse files
committed
correct character read segfault seen with GCC 12
1 parent 9e85c16 commit 5a0508c

File tree

2 files changed

+18
-16
lines changed

2 files changed

+18
-16
lines changed

src/read_scalar.f90

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,30 @@
66

77

88
module procedure nc_read_scalar
9-
integer :: varid, ier, i
10-
integer, allocatable :: dims(:)
9+
integer :: varid, ier, i, dimids(1)
10+
integer :: dims
11+
character(:), allocatable :: buf
1112

12-
if(.not.self%is_open) error stop 'nc4fortran:reader file handle not open'
13+
if(.not.self%is_open) error stop 'ERROR:nc4fortran:reader file handle not open'
1314

1415
ier = nf90_inq_varid(self%ncid, dname, varid)
16+
if (check_error(ier, dname)) error stop 'ERROR:nc4fortran:read inquire_id ' // dname // ' in ' // self%filename
1517

16-
if(ier == NF90_NOERR) then
1718
select type (value)
1819
type is (character(*))
1920
!! NetCDF4 requires knowing the exact character length as if it were an array without fill values
2021
!! HDF5 is not this strict; having a longer string variable than disk variable is OK in HDF5, but not NetCDF4
21-
call self%shape(dname, dims)
22-
charbuf : block
23-
character(len=dims(1)) :: buf
24-
ier = nf90_get_var(self%ncid, varid, buf)
25-
i = index(buf, c_null_char) - 1
26-
if(i == -1) i = len_trim(buf)
27-
value = buf(:i)
28-
end block charbuf
22+
ier = nf90_inquire_variable(self%ncid, varid, dimids = dimids)
23+
if(check_error(ier, dname)) error stop 'ERROR:nc4fortran:read_scalar: could not get dimension IDs for: ' // dname
24+
25+
ier = nf90_inquire_dimension(self%ncid, dimid=dimids(1), len=dims)
26+
if(ier/=NF90_NOERR) error stop 'ERROR:nc4fortran:read_scalar: querying dimension size'
27+
28+
allocate(character(dims) :: buf)
29+
ier = nf90_get_var(self%ncid, varid, buf)
30+
i = index(buf, c_null_char) - 1
31+
if(i == -1) i = len_trim(buf)
32+
value = buf(:i)
2933
type is (real(real64))
3034
ier = nf90_get_var(self%ncid, varid, value)
3135
type is (real(real32))
@@ -37,9 +41,7 @@
3741
class default
3842
ier = NF90_EBADTYPE
3943
end select
40-
endif
41-
42-
if (check_error(ier, dname)) error stop 'nc4fortran:read failed ' // dname // ' in ' // self%filename
44+
if (check_error(ier, dname)) error stop 'ERROR:nc4fortran:read_scalar: failed ' // dname // ' in ' // self%filename
4345

4446
end procedure nc_read_scalar
4547

src/reader.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ ier = nf90_inq_varid(self%ncid, dname, varid)
66
if (check_error(ier, dname)) error stop 'nc4fortran:read inquire_id ' // dname // ' in ' // self%filename
77

88
ier = nf90_inquire_variable(self%ncid, varid, ndims=drank)
9+
if (check_error(ier, dname)) error stop 'nc4fortran:read inquire ' // dname // ' in ' // self%filename
910
if(drank /= rank(value)) then
1011
write(stderr,*) 'ERROR:nc4fortran:read ' // dname // ' rank ', drank, ' /= variable rank ',rank(value)
1112
error stop
1213
endif
13-
if (check_error(ier, dname)) error stop 'nc4fortran:read inquire ' // dname // ' in ' // self%filename
1414

1515
select type (value)
1616
type is (real(real64))

0 commit comments

Comments
 (0)