summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDana Robinson <derobins@hdfgroup.org>2018-10-11 22:08:02 (GMT)
committerDana Robinson <derobins@hdfgroup.org>2018-10-11 22:08:02 (GMT)
commitc3a813a37fb700d2d1039d6fdc54d8e377412b76 (patch)
treeacf8f298c664139626e0a5fdf43a122fca014d9d
parent39b3b52a941dd5e012e5a472ef940d624941833b (diff)
downloadhdf5-c3a813a37fb700d2d1039d6fdc54d8e377412b76.zip
hdf5-c3a813a37fb700d2d1039d6fdc54d8e377412b76.tar.gz
hdf5-c3a813a37fb700d2d1039d6fdc54d8e377412b76.tar.bz2
Fixed a memory issue in H5Drefresh() where the dataset's H5VL_object_t
gets closed but we try to use it to find the driver.
-rw-r--r--src/H5Oflush.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/H5Oflush.c b/src/H5Oflush.c
index b27f01b..84095d9 100644
--- a/src/H5Oflush.c
+++ b/src/H5Oflush.c
@@ -301,6 +301,7 @@ H5O_refresh_metadata(hid_t oid, H5O_loc_t oloc)
H5O_loc_t obj_oloc;
H5G_name_t obj_path;
H5O_shared_t cached_H5O_shared;
+ H5VL_t *driver = NULL;
/* Create empty object location */
obj_loc.oloc = &obj_oloc;
@@ -318,25 +319,29 @@ H5O_refresh_metadata(hid_t oid, H5O_loc_t oloc)
if(H5T_save_refresh_state(oid, &cached_H5O_shared) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, FAIL, "unable to save datatype state")
- /* Get the VOL object from the ID */
+ /* Get the VOL object from the ID and cache a pointer to the driver.
+ * The vol_obj will disappear when the underlying object is closed, so
+ * we can't use that directly.
+ */
if(NULL == (vol_obj = H5VL_get_object(oid)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
+ driver = vol_obj->driver;
/* Bump the number of references on the VOL driver.
* If you don't do this, VDS refreshes can accidentally close the driver.
*/
- vol_obj->driver->nrefs++;
+ driver->nrefs++;
/* Close object & evict its metadata */
if((H5O__refresh_metadata_close(oid, oloc, &obj_loc)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to refresh object")
/* Re-open the object, re-fetching its metadata */
- if((H5O_refresh_metadata_reopen(oid, &obj_loc, vol_obj->driver, FALSE)) < 0)
+ if((H5O_refresh_metadata_reopen(oid, &obj_loc, driver, FALSE)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to refresh object")
/* Restore the number of references on the VOL driver */
- vol_obj->driver->nrefs--;
+ driver->nrefs--;
/* Restore important datatype state */
if(H5I_get_type(oid) == H5I_DATATYPE)