From ae0ae159563f4d284b4062f0c838f7c91d38f338 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Tue, 27 Jul 2004 22:22:12 -0500 Subject: [svn-r8962] Purpose: Bug fix Description: Allow I/O on extendible chunked datasets with (currently) zero-sized dimensions to proceed harmlessly instead of dumping core on an assertion. Solution: Removed assertion and added checks to avoid problem situation in H5TB_end Platforms tested: FreeBSD 4.10 (sleipnir) w/ & w/o parallel Too minor to require h5committest --- release_docs/RELEASE.txt | 3 +++ src/H5TB.c | 6 +++--- test/dsets.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index c843dde..6e9e897 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -168,6 +168,9 @@ Bug Fixes since HDF5-1.6.0 release Library ------- + - Fixed bug where I/O to an extendible chunked dataset with zero-sized + dimensions would cause library to fail an assertion. + QAK - 2004/07/27 - Fixed bug where chunked datasets which have filters defined, allocation time set to "late" and whose chunks don't align with the dataspace bounds could have incorrect data stored when diff --git a/src/H5TB.c b/src/H5TB.c index f55400a..37b32eb 100644 --- a/src/H5TB.c +++ b/src/H5TB.c @@ -1285,11 +1285,11 @@ H5TB_end(H5TB_NODE * root, int side) { FUNC_ENTER_NOAPI_NOFUNC(H5TB_end); - assert(root); assert(side==LEFT || side==RIGHT); - while (HasChild(root, side)) - root = root->link[side]; + if(root) + while (HasChild(root, side)) + root = root->link[side]; FUNC_LEAVE_NOAPI(root); } /* end H5TB_end() */ diff --git a/test/dsets.c b/test/dsets.c index d996211..cd3cbc5 100644 --- a/test/dsets.c +++ b/test/dsets.c @@ -113,6 +113,10 @@ const char *FILENAME[] = { #define NOENCODER_TEST_DATASET "noencoder_tdset.h5" #define NOENCODER_SZIP_DATASET "noencoder_szip_dset.h5" #define NOENCODER_SZIP_SHUFF_FLETCH_DATASET "noencoder_szip_shuffle_fletcher_dset.h5" + +/* Names for zero-dim test */ +#define ZERODIM_DATASET "zerodim" + /* Shared global arrays */ #define DSET_DIM1 100 #define DSET_DIM2 200 @@ -3626,6 +3630,53 @@ error: /*------------------------------------------------------------------------- + * Function: test_zero_dims + * + * Purpose: Tests read/writes to zero-sized extendible datasets + * + * Return: Success: 0 + * Failure: -1 + * + * Programmer: Quincey Koziol + * Tuesday, July 27, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static herr_t +test_zero_dims(hid_t file) +{ + hid_t s=-1, d=-1, dcpl=-1; + hsize_t dsize=0, dmax=H5S_UNLIMITED, csize=5; + + TESTING("I/O on datasets with zero-sized dims"); + + if((s = H5Screate_simple(1, &dsize, &dmax))<0) TEST_ERROR; + if((dcpl = H5Pcreate(H5P_DATASET_CREATE))<0) TEST_ERROR; + if(H5Pset_chunk(dcpl, 1, &csize)<0) TEST_ERROR; + if((d = H5Dcreate(file, ZERODIM_DATASET, H5T_NATIVE_INT, s, dcpl))<0) TEST_ERROR; + + if(H5Dwrite(d, H5T_NATIVE_INT, s, s, H5P_DEFAULT, (void*)911)<0) TEST_ERROR; + + if(H5Pclose(dcpl)<0) TEST_ERROR; + if(H5Sclose(s)<0) TEST_ERROR; + if(H5Dclose(d)<0) TEST_ERROR; + + PASSED(); + return 0; + +error: + H5E_BEGIN_TRY { + H5Pclose(dcpl); + H5Dclose(d); + H5Sclose(s); + } H5E_END_TRY; + return -1; +} /* end test_zero_dims() */ + + +/*------------------------------------------------------------------------- * Function: main * * Purpose: Tests the dataset interface (H5D) @@ -3693,6 +3744,7 @@ main(void) nerrors += test_compare_dcpl(file)<0 ?1:0; nerrors += test_filter_delete(file)<0 ?1:0; nerrors += test_filters_endianess()<0 ?1:0; + nerrors += test_zero_dims(file)<0 ?1:0; if (H5Fclose(file)<0) goto error; if (nerrors) goto error; -- cgit v0.12