diff options
-rw-r--r-- | release_docs/RELEASE.txt | 3 | ||||
-rw-r--r-- | src/H5Shyper.c | 4 | ||||
-rw-r--r-- | test/tselect.c | 97 |
3 files changed, 102 insertions, 2 deletions
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index c5bce70..09be12f 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -90,6 +90,9 @@ Library properly if they caused close() to fail. * Fixed a bug in internal B-tree code where a B-tree was not being copied correctly. + * Fixed an off-by-one error in H5Sselect_valid when hyperslab selections + which would allow hyperslab selections which overlapped the edge of the + selection by one element as valid. Configuration ------------- diff --git a/src/H5Shyper.c b/src/H5Shyper.c index 809f7e3..8be16e9 100644 --- a/src/H5Shyper.c +++ b/src/H5Shyper.c @@ -4994,9 +4994,9 @@ H5S_hyper_select_valid_helper (const H5S_hyper_span_info_t *spans, const hssize_ while(curr!=NULL && ret_value==TRUE) { /* Check if an offset has been defined */ /* Bounds check the selected point + offset against the extent */ - if(((curr->low+offset[rank])>(hssize_t)size[rank]) + if(((curr->low+offset[rank])>=(hssize_t)size[rank]) || ((curr->low+offset[rank])<0) - || ((curr->high+offset[rank])>(hssize_t)size[rank]) + || ((curr->high+offset[rank])>=(hssize_t)size[rank]) || ((curr->high+offset[rank])<0)) { ret_value=FALSE; break; diff --git a/test/tselect.c b/test/tselect.c index c5aa682..6a413bd 100644 --- a/test/tselect.c +++ b/test/tselect.c @@ -3703,6 +3703,101 @@ test_select_hyper_chunk(hid_t fapl_plist, hid_t xfer_plist) /**************************************************************** ** +** test_select_valid(): Test basic H5S (dataspace) selection code. +** Tests selection validity +** +****************************************************************/ +static void +test_select_valid(void) +{ + herr_t error; + htri_t valid; + hid_t main_space, sub_space; + hssize_t safe_start[2]={1,1}; + hsize_t safe_count[2]={1,1}; + hssize_t start[2]; + hsize_t dims[2],maxdims[2],size[2],count[2]; + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Selection Validity\n")); + + count[0] = count[1] = 1; + dims[0] = dims[1] = maxdims[0] = maxdims[1] = 10; + + main_space = H5Screate_simple(2,dims,maxdims); + CHECK(main_space, FAIL, "H5Screate_simple"); + + MESSAGE(8, ( "Case 1 : in the dimensions\nTry offset (4,4) and size(6,6), the original space is of size (10,10)\n")); + start[0] = start[1] = 4; + size[0] = size[1] = 6; + + sub_space = H5Scopy(main_space); + CHECK(sub_space, FAIL, "H5Scopy"); + + error=H5Sselect_hyperslab(sub_space,H5S_SELECT_SET,start,size,count,size); + CHECK(error, FAIL, "H5Sselect_hyperslab"); + + valid=H5Sselect_valid(sub_space); + VERIFY(valid, TRUE, "H5Sselect_valid"); + + error=H5Sselect_hyperslab(sub_space,H5S_SELECT_OR,safe_start,NULL,safe_count,NULL); + CHECK(error, FAIL, "H5Sselect_hyperslab"); + + valid=H5Sselect_valid(sub_space); + VERIFY(valid, TRUE, "H5Sselect_valid"); + + error=H5Sclose(sub_space); + CHECK(error, FAIL, "H5Sclose"); + + MESSAGE(8, ( "Case 2 : exceed dimensions by 1\nTry offset (5,5) and size(6,6), the original space is of size (10,10)\n")); + start[0] = start[1] = 5; + size[0] = size[1] = 6; + + sub_space = H5Scopy(main_space); + CHECK(sub_space, FAIL, "H5Scopy"); + + error=H5Sselect_hyperslab(sub_space,H5S_SELECT_SET,start,size,count,size); + CHECK(error, FAIL, "H5Sselect_hyperslab"); + + valid=H5Sselect_valid(sub_space); + VERIFY(valid, FALSE, "H5Sselect_valid"); + + error=H5Sselect_hyperslab(sub_space,H5S_SELECT_OR,safe_start,NULL,safe_count,NULL); + CHECK(error, FAIL, "H5Sselect_hyperslab"); + + valid=H5Sselect_valid(sub_space); + VERIFY(valid, FALSE, "H5Sselect_valid"); + + error=H5Sclose(sub_space); + CHECK(error, FAIL, "H5Sclose"); + + MESSAGE(8, ( "Case 3 : exceed dimensions by 2\nTry offset (6,6) and size(6,6), the original space is of size (10,10)\n")); + start[0] = start[1] = 6; + size[0] = size[1] = 6; + + sub_space = H5Scopy(main_space); + CHECK(sub_space, FAIL, "H5Scopy"); + + error=H5Sselect_hyperslab(sub_space,H5S_SELECT_SET,start,size,count,size); + CHECK(error, FAIL, "H5Sselect_hyperslab"); + + valid=H5Sselect_valid(sub_space); + VERIFY(valid, FALSE, "H5Sselect_valid"); + + error=H5Sselect_hyperslab(sub_space,H5S_SELECT_OR,safe_start,NULL,safe_count,NULL); + CHECK(error, FAIL, "H5Sselect_hyperslab"); + + valid=H5Sselect_valid(sub_space); + VERIFY(valid, FALSE, "H5Sselect_valid"); + + error=H5Sclose(sub_space); + CHECK(error, FAIL, "H5Sclose"); + error=H5Sclose(main_space); + CHECK(error, FAIL, "H5Sclose"); +} /* test_select_hyper_chunk() */ + +/**************************************************************** +** ** test_select(): Main H5S selection testing routine. ** ****************************************************************/ @@ -3795,6 +3890,8 @@ test_select(void) ret=H5Pclose(plist_id); CHECK(ret, FAIL, "H5Pclose"); + /* More tests for checking validity of selections */ + test_select_valid(); } /* test_select() */ |