summaryrefslogtreecommitdiffstats
path: root/src/H5T.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2002-06-11 15:58:20 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2002-06-11 15:58:20 (GMT)
commitf7a792979818e5915b231174298caceef4f387bd (patch)
tree9d5b04280fdba798ed330ef98062c29cf563d5f1 /src/H5T.c
parentc12b97f829ffada2d6af8c02dc5205c8639e9df3 (diff)
downloadhdf5-f7a792979818e5915b231174298caceef4f387bd.zip
hdf5-f7a792979818e5915b231174298caceef4f387bd.tar.gz
hdf5-f7a792979818e5915b231174298caceef4f387bd.tar.bz2
[svn-r5585] Purpose:
Bug Fix Description: H5Dcreate and H5Tcommit allow "empty" compound and enumerated types (i.e. ones with no members) to be stored in the file, but this causes an assertion failure and is somewhat vapid. Solution: Check the datatype "makes sense" before using it for H5Dcreate and H5Tcommit. Platforms tested: FreeBSD 4.5 (sleipnir)
Diffstat (limited to 'src/H5T.c')
-rw-r--r--src/H5T.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/H5T.c b/src/H5T.c
index b1029ac..567e072 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -5321,6 +5321,10 @@ H5T_commit (H5G_entry_t *loc, const char *name, H5T_t *type)
"data type is immutable");
}
+ /* Check for a "sensible" datatype to store on disk */
+ if(H5T_is_sensible(type)!=TRUE)
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "datatype is not sensible");
+
/* Find the insertion file */
if (NULL==(file=H5G_insertion_file(loc, name))) {
HRETURN_ERROR(H5E_SYM, H5E_CANTINIT, FAIL,
@@ -7502,6 +7506,59 @@ H5Tget_array_dims(hid_t type_id, hsize_t dims[], int perm[])
/*-------------------------------------------------------------------------
+ * Function: H5T_is_sensible
+ *
+ * Purpose: Determines if a data type is sensible to store on disk
+ * (i.e. not partially initialized)
+ *
+ * Return: Success: TRUE, FALSE
+ *
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * Tuesday, June 11, 2002
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5T_is_sensible(const H5T_t *dt)
+{
+ htri_t ret_value = FAIL;
+
+ FUNC_ENTER(H5T_is_sensible, FAIL);
+
+ assert(dt);
+
+ switch(dt->type) {
+ case H5T_COMPOUND:
+ /* Only allow compound datatypes with at least one member to be stored on disk */
+ if(dt->u.compnd.nmembs > 0)
+ ret_value=TRUE;
+ else
+ ret_value=FALSE;
+ break;
+
+ case H5T_ENUM:
+ /* Only allow enum datatypes with at least one member to be stored on disk */
+ if(dt->u.enumer.nmembs > 0)
+ ret_value=TRUE;
+ else
+ ret_value=FALSE;
+ break;
+
+ default:
+ /* Assume all other datatype are sensible to store on disk */
+ ret_value=TRUE;
+ break;
+ } /* end switch */
+
+ FUNC_LEAVE(ret_value);
+}
+
+
+/*-------------------------------------------------------------------------
* Function: H5T_print_stats
*
* Purpose: Print statistics about a conversion path. Statistics are