mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-01-30 15:32:37 +08:00
Merge pull request #1725 in HDFFV/hdf5 from ~DEROBINS/hdf5_der:h5dump_memory_bug to develop
* commit '0cf52525d5b45cc7cf6f89267da76b46ffa75f90': H5A__free() was renamed to H5A__shared_free() and now requires attr->shared to not be NULL. Fixed a memory issue where unfreed shared attribute dataspace memory tripped an assert in our memory sanity checks. Fixed a memory issue where unfreed shared attribute dataspace memory tripped an assert in our memory sanity checks.
This commit is contained in:
commit
436250369a
@ -325,14 +325,11 @@ H5A__dense_fnd_cb(const H5A_t *attr, hbool_t *took_ownership, void *_user_attr)
|
||||
*/
|
||||
if(*user_attr != NULL) {
|
||||
H5A_t *old_attr = *user_attr;
|
||||
if(old_attr->shared) {
|
||||
/* Free any dynamically allocated items */
|
||||
if(H5A__free(old_attr) < 0)
|
||||
HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release attribute info")
|
||||
|
||||
/* Destroy shared attribute struct */
|
||||
old_attr->shared = H5FL_FREE(H5A_shared_t, old_attr->shared);
|
||||
} /* end if */
|
||||
/* Free any dynamically allocated items */
|
||||
if(old_attr->shared)
|
||||
if(H5A__shared_free(old_attr) < 0)
|
||||
HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release attribute info")
|
||||
|
||||
old_attr = H5FL_FREE(H5A_t, old_attr);
|
||||
} /* end if */
|
||||
|
37
src/H5Aint.c
37
src/H5Aint.c
@ -1092,48 +1092,55 @@ done:
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5A__free
|
||||
* Function: H5A__shared_free
|
||||
*
|
||||
* Purpose: Frees all memory associated with an attribute, but does not
|
||||
* free the H5A_t structure (which should be done in H5T_close).
|
||||
* Purpose: Cleans up the shared attribute data. This will free
|
||||
* the attribute's shared structure as well.
|
||||
*
|
||||
* attr and attr->shared must not be NULL
|
||||
*
|
||||
* Return: SUCCEED/FAIL
|
||||
*
|
||||
* Programmer: Quincey Koziol
|
||||
* Monday, November 15, 2004
|
||||
* Programmer: Quincey Koziol
|
||||
* Monday, November 15, 2004
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5A__free(H5A_t *attr)
|
||||
H5A__shared_free(H5A_t *attr)
|
||||
{
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_PACKAGE
|
||||
|
||||
HDassert(attr);
|
||||
HDassert(attr->shared);
|
||||
|
||||
/* Free dynamically allocated items */
|
||||
/* Free dynamically allocated items.
|
||||
* When possible, keep trying to shut things down (via HDONE_ERROR).
|
||||
*/
|
||||
if(attr->shared->name) {
|
||||
H5MM_xfree(attr->shared->name);
|
||||
attr->shared->name = NULL;
|
||||
}
|
||||
if(attr->shared->dt) {
|
||||
if(H5T_close_real(attr->shared->dt) < 0)
|
||||
HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release datatype info")
|
||||
HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release datatype info")
|
||||
attr->shared->dt = NULL;
|
||||
}
|
||||
if(attr->shared->ds) {
|
||||
if(H5S_close(attr->shared->ds) < 0)
|
||||
HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release dataspace info")
|
||||
HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release dataspace info")
|
||||
attr->shared->ds = NULL;
|
||||
}
|
||||
if(attr->shared->data)
|
||||
attr->shared->data = H5FL_BLK_FREE(attr_buf, attr->shared->data);
|
||||
|
||||
done:
|
||||
/* Destroy shared attribute struct */
|
||||
attr->shared = H5FL_FREE(H5A_shared_t, attr->shared);
|
||||
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5A__free() */
|
||||
} /* end H5A__shared_free() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -1197,11 +1204,9 @@ H5A__close(H5A_t *attr)
|
||||
/* Reference count can be 0. It only happens when H5A__create fails. */
|
||||
if(attr->shared->nrefs <= 1) {
|
||||
/* Free dynamically allocated items */
|
||||
if(H5A__free(attr) < 0)
|
||||
HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release attribute info")
|
||||
|
||||
/* Destroy shared attribute struct */
|
||||
attr->shared = H5FL_FREE(H5A_shared_t, attr->shared);
|
||||
if(attr->shared)
|
||||
if(H5A__shared_free(attr) < 0)
|
||||
HGOTO_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't release attribute info")
|
||||
} /* end if */
|
||||
else {
|
||||
/* There are other references to the shared part of the attribute.
|
||||
|
@ -196,7 +196,7 @@ H5_DLL H5A_t *H5A__copy(H5A_t *new_attr, const H5A_t *old_attr);
|
||||
H5_DLL hid_t H5A__get_type(H5A_t *attr);
|
||||
H5_DLL herr_t H5A__get_info(const H5A_t *attr, H5A_info_t *ainfo);
|
||||
H5_DLL hid_t H5A__get_create_plist(H5A_t* attr);
|
||||
H5_DLL herr_t H5A__free(H5A_t *attr);
|
||||
H5_DLL herr_t H5A__shared_free(H5A_t *attr);
|
||||
H5_DLL herr_t H5A__close(H5A_t *attr);
|
||||
H5_DLL herr_t H5A__close_cb(H5VL_object_t *attr_vol_obj);
|
||||
H5_DLL htri_t H5A__get_ainfo(H5F_t *f, H5O_t *oh, H5O_ainfo_t *ainfo);
|
||||
|
@ -200,7 +200,7 @@ H5O_attr_decode(H5F_t *f, H5O_t *open_oh, unsigned H5_ATTR_UNUSED mesg_flags,
|
||||
* What's actually shared, though, is only the extent.
|
||||
*/
|
||||
if(NULL == (attr->shared->ds = H5FL_CALLOC(H5S_t)))
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
|
||||
|
||||
/* Decode attribute's dataspace extent */
|
||||
if((extent = (H5S_extent_t *)(H5O_MSG_SDSPACE->decode)(f, open_oh,
|
||||
@ -253,15 +253,11 @@ H5O_attr_decode(H5F_t *f, H5O_t *open_oh, unsigned H5_ATTR_UNUSED mesg_flags,
|
||||
done:
|
||||
if(NULL == ret_value)
|
||||
if(attr) {
|
||||
if(attr->shared) {
|
||||
/* Free any dynamically allocated items */
|
||||
if(H5A__free(attr) < 0)
|
||||
/* Free any dynamically allocated items */
|
||||
if(attr->shared)
|
||||
if(H5A__shared_free(attr) < 0)
|
||||
HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, NULL, "can't release attribute info")
|
||||
|
||||
/* Destroy shared attribute struct */
|
||||
attr->shared = H5FL_FREE(H5A_shared_t, attr->shared);
|
||||
} /* end if */
|
||||
|
||||
attr = H5FL_FREE(H5A_t, attr);
|
||||
} /* end if */
|
||||
|
||||
|
10
src/H5S.c
10
src/H5S.c
@ -448,10 +448,14 @@ H5S_close(H5S_t *ds)
|
||||
if(H5S__extent_release(&ds->extent) < 0)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace extent")
|
||||
|
||||
/* Release the main structure */
|
||||
ds = H5FL_FREE(H5S_t, ds);
|
||||
|
||||
done:
|
||||
/* Release the main structure.
|
||||
* Always do this to ensure that we don't leak memory when calling this
|
||||
* function on partially constructed dataspaces (which will fail one or
|
||||
* both of the above calls)
|
||||
*/
|
||||
H5FL_FREE(H5S_t, ds);
|
||||
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5S_close() */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user