summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Fortner <nfortne2@hdfgroup.org>2015-08-28 19:43:03 (GMT)
committerNeil Fortner <nfortne2@hdfgroup.org>2015-08-28 19:43:03 (GMT)
commit1847391fc51728811407f3e1586213758c1d0e89 (patch)
treef905735e225f2173a0694f1aa3bf4f99aa535a7f
parent1252bc4e669306b0e029e26b7283d1685fa2ccbc (diff)
downloadhdf5-1847391fc51728811407f3e1586213758c1d0e89.zip
hdf5-1847391fc51728811407f3e1586213758c1d0e89.tar.gz
hdf5-1847391fc51728811407f3e1586213758c1d0e89.tar.bz2
[svn-r27605] Fix potential memory error when using a dataspace that was created with
H5Screate and had its extent set by H5Sextent_copy. Tested: jam, ostrich (h5committest)
-rw-r--r--src/H5S.c2
-rw-r--r--test/th5s.c43
2 files changed, 44 insertions, 1 deletions
diff --git a/src/H5S.c b/src/H5S.c
index 9b37797..efb9d34 100644
--- a/src/H5S.c
+++ b/src/H5S.c
@@ -190,7 +190,7 @@ H5S_create(H5S_class_t type)
FUNC_ENTER_NOAPI(NULL)
/* Create a new dataspace */
- if(NULL == (new_ds = H5FL_MALLOC(H5S_t)))
+ if(NULL == (new_ds = H5FL_CALLOC(H5S_t)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
/* Initialize default dataspace state */
diff --git a/test/th5s.c b/test/th5s.c
index 1560ef4..9d08abe 100644
--- a/test/th5s.c
+++ b/test/th5s.c
@@ -2326,6 +2326,48 @@ test_h5s_extent_copy(void)
/****************************************************************
**
+** test_h5s_bug1(): Test Creating dataspace with H5Screate then
+* setting extent with H5Sextent_copy.
+**
+****************************************************************/
+static void
+test_h5s_bug1(void)
+{
+ hid_t space1; /* Dataspace to copy extent to */
+ hid_t space2; /* Scalar dataspace */
+ hsize_t dims[2] = {10, 10}; /* Dimensions */
+ hsize_t start[2] = {0, 0}; /* Hyperslab start */
+ htri_t select_valid; /* Whether the dataspace selection is valid */
+ herr_t ret; /* Generic error return */
+
+ /* Create dataspaces */
+ space1 = H5Screate(H5S_SIMPLE);
+ CHECK(space1, FAIL, "H5Screate");
+ space2 = H5Screate_simple(2, dims, NULL);
+ CHECK(space2, FAIL, "H5Screate");
+
+ /* Copy extent to space1 */
+ ret = H5Sextent_copy(space1, space2);
+ CHECK(ret, FAIL, "H5Sextent_copy");
+
+ /* Select hyperslab in space1 containing entire extent */
+ ret = H5Sselect_hyperslab(space1, H5S_SELECT_SET, start, NULL, dims, NULL);
+ CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+ /* Check that space1's selection is valid */
+ select_valid = H5Sselect_valid(space1);
+ CHECK(select_valid, FAIL, "H5Sselect_valid");
+ VERIFY(select_valid, TRUE, "H5Sselect_valid result");
+
+ /* Close dataspaces */
+ ret = H5Sclose(space1);
+ CHECK(ret, FAIL, "H5Sclose");
+ ret = H5Sclose(space2);
+ CHECK(ret, FAIL, "H5Sclose");
+} /* test_h5s_bug1() */
+
+/****************************************************************
+**
** test_h5s(): Main H5S (dataspace) testing routine.
**
****************************************************************/
@@ -2350,6 +2392,7 @@ test_h5s(void)
test_h5s_extent_equal(); /* Test extent comparison code */
test_h5s_extent_copy(); /* Test extent copy code */
+ test_h5s_bug1(); /* Test bug in offset initialization */
} /* test_h5s() */