mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-04-18 17:40:55 +08:00
[svn-r19798] Purpose:
Add additional error checking to catch erroneous user input. Description: Attempting to retrieve a links's name by index in the case where the link is external and the file that the object is located in doesn't exist was causing a segmentation fault (in production) and an assertion failure (in debug). The segfault wasn't occuring until the metadata accumulator attempted a write, so I've added error checking higher in the pipeline in H5O_protect (where there was previously just an assert) to catch this. I've also added additional asserts in the H5F layer where there were none. Additionally, I added another case to the links.c test to test that this fails gracefully instead of segfaulting or asserting out. Tested: h5committest and gandalf (mac os x)
This commit is contained in:
parent
c249ccfd15
commit
39e3974628
@ -249,6 +249,10 @@ Bug Fixes since HDF5-1.8.0 release
|
||||
|
||||
Library
|
||||
-------
|
||||
- Retrieving a link's name by index in the case where the link is
|
||||
external and the file that the link refers to doesn't exist will
|
||||
now fail gracefully rather than cause a segmentation fault.
|
||||
(MAM - 2010/11/17)
|
||||
- Modified library to always cache symbol table information. Libraries
|
||||
version 1.6.3 have a bug which causes them to require this
|
||||
information for some operations. (NAF - 2010/09/21 - 1864)
|
||||
|
@ -102,6 +102,7 @@ H5F_block_read(const H5F_t *f, H5FD_mem_t type, haddr_t addr, size_t size,
|
||||
HDassert(f);
|
||||
HDassert(f->shared);
|
||||
HDassert(buf);
|
||||
HDassert(H5F_addr_defined(addr));
|
||||
|
||||
/* Check for attempting I/O on 'temporary' file address */
|
||||
if(H5F_addr_le(f->shared->tmp_addr, (addr + size)))
|
||||
@ -146,6 +147,7 @@ HDfprintf(stderr, "%s: write to addr = %a, size = %Zu\n", FUNC, addr, size);
|
||||
HDassert(f->shared);
|
||||
HDassert(f->intent & H5F_ACC_RDWR);
|
||||
HDassert(buf);
|
||||
HDassert(H5F_addr_defined(addr));
|
||||
|
||||
/* Check for attempting I/O on 'temporary' file address */
|
||||
if(H5F_addr_le(f->shared->tmp_addr, (addr + size)))
|
||||
|
@ -1662,7 +1662,10 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC_protect_t prot)
|
||||
/* check args */
|
||||
HDassert(loc);
|
||||
HDassert(loc->file);
|
||||
HDassert(H5F_addr_defined(loc->addr));
|
||||
|
||||
/* Check for valid address */
|
||||
if(!H5F_addr_defined(loc->addr))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "address undefined")
|
||||
|
||||
/* Check for write access on the file */
|
||||
file_intent = H5F_INTENT(loc->file);
|
||||
|
17
test/links.c
17
test/links.c
@ -2640,6 +2640,8 @@ external_link_dangling(hid_t fapl, hbool_t new_format)
|
||||
{
|
||||
hid_t fid = (-1); /* File ID */
|
||||
hid_t gid = (-1); /* Group IDs */
|
||||
hid_t rid = (-1); /* Root Group ID */
|
||||
hid_t status = (-1); /* Status */
|
||||
char filename1[NAME_BUF_SIZE],
|
||||
filename2[NAME_BUF_SIZE]; /* Names of files to externally link across */
|
||||
|
||||
@ -2672,6 +2674,9 @@ external_link_dangling(hid_t fapl, hbool_t new_format)
|
||||
/* Open first file */
|
||||
if((fid=H5Fopen(filename1, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR
|
||||
|
||||
/* Get root group ID */
|
||||
if((rid=H5Gopen2(fid, "/", H5P_DEFAULT)) < 0) TEST_ERROR;
|
||||
|
||||
/* Open object through dangling file external link */
|
||||
H5E_BEGIN_TRY {
|
||||
gid = H5Gopen2(fid, "no_file", H5P_DEFAULT);
|
||||
@ -2692,6 +2697,18 @@ external_link_dangling(hid_t fapl, hbool_t new_format)
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Try to get name of object by index through dangling file external link */
|
||||
H5E_BEGIN_TRY {
|
||||
status = H5Lget_name_by_idx(rid, "no_file", H5_INDEX_NAME, H5_ITER_INC, 0, NULL, 0, H5P_DEFAULT);
|
||||
} H5E_END_TRY;
|
||||
if (status >= 0) {
|
||||
H5_FAILED();
|
||||
puts(" Retreiving name of object by index through dangling file external link should have failed.");
|
||||
} /* end if */
|
||||
|
||||
/* Close root group */
|
||||
if(H5Gclose(rid) < 0) TEST_ERROR
|
||||
|
||||
/* Close first file */
|
||||
if(H5Fclose(fid) < 0) TEST_ERROR
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user