Skip to content

Commit bcd8621

Browse files
committed
correct / enhance istart,iend bounds checks
fixes #54
1 parent 9a7d1ee commit bcd8621

File tree

3 files changed

+39
-6
lines changed

3 files changed

+39
-6
lines changed

src/utils.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@
311311
write(stderr,*) "ERROR:h5fortran:get_slice: memory size /= dataset size: check variable slice (index). " // &
312312
" Dset_dims:", ddims, "C Mem_dims:", c_mem_dims, "mem_dims:", mem_dims, "rank(mem_dims):", rank(mem_dims)
313313
error stop "ERROR:h5fortran:get_slice " // dset_name
314-
elseif(any(iend-1 > ddims)) then
314+
elseif(any(iend-istart+1 > ddims)) then
315315
write(stderr,*) "ERROR:h5fortran:get_slice: iend: ", iend, ' > dset_dims: ', ddims
316316
error stop "ERROR:h5fortran:get_slice " // dset_name
317317
endif

src/write.f90

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
integer :: ier, drank, i
5959
integer(HID_T) :: dcpl
6060
integer(HSIZE_T), dimension(:), allocatable :: ddims, maxdims
61+
character(:), allocatable :: emsg
6162

6263

6364
call H5Tcopy_f(dtype, dtype_id, ier)
@@ -80,19 +81,42 @@
8081
call estop(ier, "create:H5Dget_space", self%filename, dname)
8182

8283

83-
if (present(istart)) then
84-
if(any(istart < 1)) error stop 'ERROR:h5fortran:create: istart must be >= 1'
85-
if(any(iend <= istart)) error stop 'ERROR:h5fortran:create: iend must be > istart'
86-
84+
if (present(istart) .and. present(iend)) then
8785
call H5Sget_simple_extent_ndims_f(filespace_id, drank, ier)
8886
call estop(ier, "create:H5Sget_simple_extent_ndims", self%filename, dname)
8987

88+
if (size(istart) /= drank) then
89+
write(stderr,*) "ERROR:h5fortran:create: " // dname // " istart ", istart, " length ", size(istart), " /= rank ", drank
90+
error stop
91+
endif
92+
if (size(iend) /= drank) then
93+
write(stderr,*) "ERROR:h5fortran:create: " // dname // " iend ", iend, " length ", size(iend), " /= rank ", drank
94+
error stop
95+
endif
96+
if(any(istart < 1)) error stop 'ERROR:h5fortran:create: ' // dname // ' istart must be >= 1'
97+
do i = 1, drank
98+
if(iend(i) < istart(i)) emsg = 'ERROR:h5fortran:create: ' // dname // ' iend must be > istart'
99+
enddo
100+
if (allocated(emsg)) then
101+
write(stderr,*) emsg // " dataset: " // dname // " file: " // self%filename // " istart: ", &
102+
istart, " iend: ", iend
103+
error stop
104+
endif
105+
90106
allocate(ddims(drank), maxdims(drank))
91107

92108
call H5Sget_simple_extent_dims_f(filespace_id, ddims, maxdims, ier)
93109
if (ier /= drank) error stop 'ERROR:h5fortran:create: H5Sget_simple_extent_dims: ' // dname // ' in ' // self%filename
94110

95-
if(any(iend > ddims)) error stop 'ERROR:h5fortran:create: iend > dset_dims' // dname // ' in ' // self%filename
111+
do i = 1, drank
112+
if (iend(i) - istart(i) > ddims(i)) emsg = 'ERROR:h5fortran:create: iend - istart > dset_dims'
113+
enddo
114+
if (allocated(emsg)) then
115+
write(stderr,*) emsg // " dataset: " // dname // " file: " // self%filename // " istart: ", &
116+
istart, " iend: ", iend, " ddims: ", ddims, " maxdims: ", maxdims
117+
error stop
118+
endif
119+
96120
else
97121
if (size(mem_dims) == 0) then
98122
!! scalar

test/test_array.f90

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ subroutine test_basic_array(filename)
5858
call h%write('/sub-int32-2d', i2_8(3:6, 4:7))
5959
print '(4i3)', i2_8(3:6, 4:7)
6060

61+
call h % write('/endstart', i2t)
62+
call h % write('/endstart', reshape([5], [1, 1]), istart=[3,2], iend=[3,2])
63+
6164
call h%close()
6265

6366
!! read
@@ -95,6 +98,12 @@ subroutine test_basic_array(filename)
9598
call h%read('real32-2d', B(2:5,3:6))
9699
if(.not.all(B(2:5,3:6) == r2)) error stop 'real 2D: reading into variable slice'
97100

101+
call h % read('/endstart', i2t(1:1,1:1), istart=[3,2], iend=[3,2])
102+
if (i2t(1,1) /= 5) then
103+
write(stderr, '(a,i3)') 'read endstart does not match write: expected 5 but got ', i2t(1,1)
104+
error stop 'ERROR: read endstart fail'
105+
endif
106+
98107
call h%close()
99108

100109
end subroutine test_basic_array

0 commit comments

Comments
 (0)