diff options
author | James Laird <jlaird@hdfgroup.org> | 2004-07-27 16:56:19 (GMT) |
---|---|---|
committer | James Laird <jlaird@hdfgroup.org> | 2004-07-27 16:56:19 (GMT) |
commit | 52563e6fa8c56bc68051c50e9e847293da30a008 (patch) | |
tree | d6c2acb4013c54be48da0449c5ae3695cf6e421c /src | |
parent | 6dae05b645086f67a45d4a3d3ab91f303a3362c0 (diff) | |
download | hdf5-52563e6fa8c56bc68051c50e9e847293da30a008.zip hdf5-52563e6fa8c56bc68051c50e9e847293da30a008.tar.gz hdf5-52563e6fa8c56bc68051c50e9e847293da30a008.tar.bz2 |
[svn-r8954]
Purpose:
Bug fix
Description:
When a simple dataspace is created, its extent should be set before using it,
or it will silently function as a NULL dataspace.
Solution:
Added checks on user-supplied dataspaces. Now dataspaces without extents set
will throw errors; users must explicitly set a dataspace to be NULL.
Platforms tested:
sleipnir, windows
Diffstat (limited to 'src')
-rw-r--r-- | src/H5A.c | 4 | ||||
-rw-r--r-- | src/H5D.c | 6 | ||||
-rw-r--r-- | src/H5Dio.c | 18 | ||||
-rw-r--r-- | src/H5S.c | 32 | ||||
-rw-r--r-- | src/H5Sprivate.h | 1 |
5 files changed, 60 insertions, 1 deletions
@@ -226,6 +226,10 @@ H5A_create(const H5G_entry_t *ent, const char *name, const H5T_t *type, assert(type); assert(space); + /* Check if the dataspace has an extent set (or is NULL) */ + if( !(H5S_has_extent(space)) ) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspace extent has not been set") + /* Build the attribute information */ if((attr = H5MM_calloc(sizeof(H5A_t)))==NULL) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for attribute info") @@ -2028,6 +2028,10 @@ H5D_create(H5G_entry_t *loc, const char *name, hid_t type_id, const H5S_t *space if(H5T_detect_class(type, H5T_VLEN)) has_vl_type=TRUE; + /* Check if the dataspace has an extent set (or is NULL) */ + if( !(H5S_has_extent(space)) ) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "dataspace extent has not been set") + /* Initialize the dataset object */ if(NULL == (new_dset = H5D_new(dcpl_id,TRUE,has_vl_type))) HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") @@ -3458,6 +3462,8 @@ H5Diterate(void *buf, hid_t type_id, hid_t space_id, H5D_operator_t op, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid datatype") if (NULL == (space = H5I_object_verify(space_id, H5I_DATASPACE))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataspace") + if( !(H5S_has_extent(space)) ) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspace does not have extent set") ret_value=H5S_select_iterate(buf,type_id,space,op,operator_data); diff --git a/src/H5Dio.c b/src/H5Dio.c index f9572b3..32e6a28 100644 --- a/src/H5Dio.c +++ b/src/H5Dio.c @@ -229,6 +229,10 @@ H5D_fill(const void *fill, const H5T_t *fill_type, void *buf, const H5T_t *buf_t assert(buf_type); assert(space); + /* Make sure the dataspace has an extent set */ + if( !(H5S_has_extent(space)) ) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspace extent has not been set") + /* Get the memory and file datatype sizes */ src_type_size = H5T_get_size(fill_type); dst_type_size = H5T_get_size(buf_type); @@ -682,6 +686,12 @@ H5D_read(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space, if (nelmts!=(hsize_t)H5S_GET_SELECT_NPOINTS(file_space)) HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "src and dest data spaces have different sizes") + /* Make sure that both selections have their extents set */ + if( !(H5S_has_extent(file_space)) ) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file dataspace does not have extent set") + if( !(H5S_has_extent(mem_space)) ) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "memory dataspace does not have extent set") + /* Retrieve dataset properties */ /* <none needed in the general case> */ @@ -907,6 +917,12 @@ H5D_write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space, if (nelmts!=(hsize_t)H5S_GET_SELECT_NPOINTS(file_space)) HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "src and dest data spaces have different sizes") + /* Make sure that both selections have their extents set */ + if( !(H5S_has_extent(file_space)) ) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file dataspace does not have extent set") + if( !(H5S_has_extent(mem_space)) ) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "memory dataspace does not have extent set") + /* Retrieve dataset properties */ /* <none needed currently> */ @@ -2478,7 +2494,7 @@ H5D_create_chunk_map(H5D_t *dataset, const H5T_t *mem_type, const H5S_t *file_sp } /* end if */ } /* end else */ -#ifdef QAK +#ifdef QAK { int mpi_rank; double time; @@ -1912,6 +1912,38 @@ done: FUNC_LEAVE_NOAPI(ret_value); } +/*------------------------------------------------------------------------- + * Function: H5S_has_extent + * + * Purpose: Determines if a simple dataspace's extent has been set (e.g., + * by H5Sset_extent_simple() ). Helps avoid write errors. + * + * Return: TRUE if dataspace has extent set + * FALSE if dataspace's extent is uninitialized + * + * Programmer: James Laird + * + * Date: July 23, 2004 + * + *------------------------------------------------------------------------- + */ +hbool_t +H5S_has_extent(const H5S_t *ds) +{ + htri_t ret_value; + FUNC_ENTER_NOAPI(H5S_has_extent, FAIL) + + assert(ds); + + if(ds->extent.rank==0 && ds->extent.nelem == 0) + ret_value = FALSE; + else + ret_value = TRUE; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} + /*------------------------------------------------------------------------- * Function: H5S_set_extent_real diff --git a/src/H5Sprivate.h b/src/H5Sprivate.h index 659489e..7de895a 100644 --- a/src/H5Sprivate.h +++ b/src/H5Sprivate.h @@ -211,6 +211,7 @@ H5_DLL H5S_conv_t *H5S_find(const H5S_t *mem_space, const H5S_t *file_space, H5_DLL H5S_class_t H5S_get_simple_extent_type(const H5S_t *ds); H5_DLL hssize_t H5S_get_simple_extent_npoints(const H5S_t *ds); H5_DLL hsize_t H5S_get_npoints_max(const H5S_t *ds); +H5_DLL hbool_t H5S_has_extent(const H5S_t *ds); H5_DLL int H5S_get_simple_extent_ndims(const H5S_t *ds); H5_DLL int H5S_get_simple_extent_dims(const H5S_t *ds, hsize_t dims[]/*out*/, hsize_t max_dims[]/*out*/); |