mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-11-27 02:10:55 +08:00
[svn-r10620] Purpose:
Bug fix Description: Opening a dataset (or named datatype) with "." for the name and using a group ID for the location ID was not returning an error value. Solution: Check the type of the object before attempting to open it (internally, using a group ID and "." for the name maps to the group object). Platforms tested: FreeBSD 4.11 (sleipnir) Solaris 2.9 (shanti) Too minor to require h5committest
This commit is contained in:
parent
3c5faf9fb6
commit
9b68e8e927
10
src/H5D.c
10
src/H5D.c
@ -1233,7 +1233,7 @@ done:
|
||||
hid_t
|
||||
H5Dopen(hid_t loc_id, const char *name)
|
||||
{
|
||||
H5D_t *dset;
|
||||
H5D_t *dset = NULL;
|
||||
H5G_entry_t *loc = NULL; /*location holding the dataset */
|
||||
H5G_entry_t ent; /*dataset symbol table entry */
|
||||
hid_t dxpl_id = H5AC_dxpl_id; /* dxpl to use to open datset */
|
||||
@ -1252,6 +1252,10 @@ H5Dopen(hid_t loc_id, const char *name)
|
||||
if (H5G_find(loc, name, NULL, &ent, dxpl_id) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, FAIL, "not found")
|
||||
|
||||
/* Check that the object found is the correct type */
|
||||
if (H5G_get_type(&ent, dxpl_id) != H5G_DATASET)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
|
||||
|
||||
/* Open the dataset */
|
||||
if ((dset = H5D_open(&ent, dxpl_id))==NULL)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't open dataset")
|
||||
@ -1261,6 +1265,10 @@ H5Dopen(hid_t loc_id, const char *name)
|
||||
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "can't register dataset atom")
|
||||
|
||||
done:
|
||||
if(ret_value < 0)
|
||||
if(dset != NULL)
|
||||
if(H5D_close(dset) < 0)
|
||||
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
|
||||
FUNC_LEAVE_API(ret_value)
|
||||
}
|
||||
|
||||
|
@ -1578,6 +1578,10 @@ H5Topen(hid_t loc_id, const char *name)
|
||||
if (H5G_find (loc, name, NULL, &ent/*out*/, dxpl_id)<0)
|
||||
HGOTO_ERROR (H5E_DATATYPE, H5E_NOTFOUND, FAIL, "not found");
|
||||
|
||||
/* Check that the object found is the correct type */
|
||||
if (H5G_get_type(&ent, dxpl_id) != H5G_TYPE)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a named datatype")
|
||||
|
||||
/* Open it */
|
||||
if ((type=H5T_open (&ent, dxpl_id)) ==NULL)
|
||||
HGOTO_ERROR (H5E_DATATYPE, H5E_CANTOPENOBJ, FAIL, "unable to open named data type");
|
||||
|
124
test/tfile.c
124
test/tfile.c
@ -1293,6 +1293,129 @@ test_file_ishdf5(void)
|
||||
|
||||
} /* end test_file_ishdf5() */
|
||||
|
||||
/****************************************************************
|
||||
**
|
||||
** test_file_open_dot(): low-level file test routine.
|
||||
** This test checks whether opening objects with "." for a name
|
||||
** works correctly in variuous situations.
|
||||
**
|
||||
*****************************************************************/
|
||||
static void
|
||||
test_file_open_dot(void)
|
||||
{
|
||||
hid_t fid; /* File ID */
|
||||
hid_t gid, gid2; /* Group IDs */
|
||||
hid_t did; /* Dataset ID */
|
||||
hid_t sid; /* Dataspace ID */
|
||||
hid_t tid, tid2; /* Datatype IDs */
|
||||
herr_t ret;
|
||||
|
||||
/* Output message about test being performed */
|
||||
MESSAGE(5, ("Testing opening objects with \".\" for a name\n"));
|
||||
|
||||
/* Create a new HDF5 file to work with */
|
||||
fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
|
||||
CHECK(fid, FAIL, "H5Fcreate");
|
||||
|
||||
/* Create a group in the HDF5 file */
|
||||
gid = H5Gcreate(fid, GRP_NAME, 0);
|
||||
CHECK(gid, FAIL, "H5Gcreate");
|
||||
|
||||
/* Create a dataspace for creating datasets */
|
||||
sid = H5Screate(H5S_SCALAR);
|
||||
CHECK(sid, FAIL, "H5Screate");
|
||||
|
||||
/* Create a dataset with no name using the file ID */
|
||||
H5E_BEGIN_TRY {
|
||||
did = H5Dcreate(fid, ".", H5T_NATIVE_INT, sid, H5P_DEFAULT);
|
||||
} H5E_END_TRY;
|
||||
VERIFY(did, FAIL, "H5Dcreate");
|
||||
|
||||
/* Create a dataset with no name using the group ID */
|
||||
H5E_BEGIN_TRY {
|
||||
did = H5Dcreate(gid, ".", H5T_NATIVE_INT, sid, H5P_DEFAULT);
|
||||
} H5E_END_TRY;
|
||||
VERIFY(did, FAIL, "H5Dcreate");
|
||||
|
||||
/* Open a dataset with no name using the file ID */
|
||||
H5E_BEGIN_TRY {
|
||||
did = H5Dopen(fid, ".");
|
||||
} H5E_END_TRY;
|
||||
VERIFY(did, FAIL, "H5Dopen");
|
||||
|
||||
/* Open a dataset with no name using the group ID */
|
||||
H5E_BEGIN_TRY {
|
||||
did = H5Dopen(gid, ".");
|
||||
} H5E_END_TRY;
|
||||
VERIFY(did, FAIL, "H5Dopen");
|
||||
|
||||
/* Make a copy of a datatype to use for creating a named datatype */
|
||||
tid = H5Tcopy(H5T_NATIVE_INT);
|
||||
CHECK(tid, FAIL, "H5Tcopy");
|
||||
|
||||
/* Create a named datatype with no name using the file ID */
|
||||
H5E_BEGIN_TRY {
|
||||
ret = H5Tcommit(fid, ".", tid);
|
||||
} H5E_END_TRY;
|
||||
VERIFY(ret, FAIL, "H5Tcommit");
|
||||
|
||||
/* Create a named datatype with no name using the group ID */
|
||||
H5E_BEGIN_TRY {
|
||||
ret = H5Tcommit(gid, ".", tid);
|
||||
} H5E_END_TRY;
|
||||
VERIFY(ret, FAIL, "H5Tcommit");
|
||||
|
||||
/* Open a named datatype with no name using the file ID */
|
||||
H5E_BEGIN_TRY {
|
||||
tid2 = H5Topen(fid, ".");
|
||||
} H5E_END_TRY;
|
||||
VERIFY(tid2, FAIL, "H5Topen");
|
||||
|
||||
/* Open a named datatype with no name using the group ID */
|
||||
H5E_BEGIN_TRY {
|
||||
tid2 = H5Topen(gid, ".");
|
||||
} H5E_END_TRY;
|
||||
VERIFY(tid2, FAIL, "H5Topen");
|
||||
|
||||
/* Create a group with no name using the file ID */
|
||||
H5E_BEGIN_TRY {
|
||||
gid2 = H5Gcreate(fid, ".", 0);
|
||||
} H5E_END_TRY;
|
||||
VERIFY(gid2, FAIL, "H5Gcreate");
|
||||
|
||||
/* Create a group with no name using the group ID */
|
||||
H5E_BEGIN_TRY {
|
||||
gid2 = H5Gcreate(gid, ".", 0);
|
||||
} H5E_END_TRY;
|
||||
VERIFY(gid2, FAIL, "H5Gcreate");
|
||||
|
||||
/* Open a group with no name using the file ID (should open the root group) */
|
||||
gid2 = H5Gopen(fid, ".");
|
||||
CHECK(gid2, FAIL, "H5Gopen");
|
||||
|
||||
ret = H5Gclose(gid2);
|
||||
CHECK(ret, FAIL, "H5Gclose");
|
||||
|
||||
/* Open a group with no name using the group ID (should open the group again) */
|
||||
gid2 = H5Gopen(gid, ".");
|
||||
CHECK(gid2, FAIL, "H5Gopen");
|
||||
|
||||
ret = H5Gclose(gid2);
|
||||
CHECK(ret, FAIL, "H5Gclose");
|
||||
|
||||
|
||||
/* Close everything */
|
||||
ret = H5Sclose(sid);
|
||||
CHECK(ret, FAIL, "H5Sclose");
|
||||
|
||||
ret = H5Gclose(gid);
|
||||
CHECK(ret, FAIL, "H5Gclose");
|
||||
|
||||
ret = H5Fclose(fid);
|
||||
CHECK(ret, FAIL, "H5Fclose");
|
||||
|
||||
} /* end test_file_open_dot() */
|
||||
|
||||
/****************************************************************
|
||||
**
|
||||
** test_file(): Main low-level file I/O test routine.
|
||||
@ -1313,6 +1436,7 @@ test_file(void)
|
||||
test_file_perm(); /* Test file access permissions */
|
||||
test_file_freespace(); /* Test file free space information */
|
||||
test_file_ishdf5(); /* Test detecting HDF5 files correctly */
|
||||
test_file_open_dot(); /* Test opening objects with "." for a name */
|
||||
} /* test_file() */
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user