File Patch-H5Tcommit.c.patch of Package hdf5.34207
From: Egbert Eich <eich@suse.com>
Date: Wed May 22 09:28:45 2024 +0200
Subject: Patch H5Tcommit.c
Patch-mainline: Upstream
Git-repo: https://github.com/HDFGroup/hdf5
Git-commit: 41e5c77f8dd52d2a15793165152389e45814ec98
References: bsc#1224158
Signed-off-by: Egbert Eich <eich@suse.de>
---
src/H5Tcommit.c | 58 +++++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 44 insertions(+), 14 deletions(-)
diff --git a/src/H5Tcommit.c b/src/H5Tcommit.c
index 501af20d4b..48ecc48e7d 100644
--- a/src/H5Tcommit.c
+++ b/src/H5Tcommit.c
@@ -321,9 +321,11 @@ done:
herr_t
H5T__commit(H5F_t *file, H5T_t *type, hid_t tcpl_id)
{
+ H5O_t *oh = NULL; /* Pointer to actual object header */
H5O_loc_t temp_oloc; /* Temporary object header location */
H5G_name_t temp_path; /* Temporary path */
hbool_t loc_init = FALSE; /* Have temp_oloc and temp_path been initialized? */
+ bool ohdr_created = false; /* Has the object header been created yet? */
size_t dtype_size; /* Size of the datatype message */
herr_t ret_value = SUCCEED; /* Return value */
@@ -378,9 +380,22 @@ H5T__commit(H5F_t *file, H5T_t *type, hid_t tcpl_id)
*/
if (H5O_create(file, dtype_size, (size_t)1, tcpl_id, &temp_oloc) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to create datatype object header")
- if (H5O_msg_create(&temp_oloc, H5O_DTYPE_ID, H5O_MSG_FLAG_CONSTANT | H5O_MSG_FLAG_DONTSHARE,
+ ohdr_created = true;
+
+ /* Pin the object header */
+ if (NULL == (oh = H5O_pin(&temp_oloc)))
+ HGOTO_ERROR(H5E_ATTR, H5E_CANTPIN, FAIL, "unable to pin object header");
+
+ /* Check for creating committed datatype with unusual datatype */
+ if (H5T_is_numeric_with_unusual_unused_bits(type) &&
+ !(H5O_has_chksum(oh) ||
+ (H5F_RFIC_FLAGS(file) & H5F_RFIC_UNUSUAL_NUM_UNUSED_NUMERIC_BITS)))
+ HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "creating committed datatype with unusual datatype, see documentation for H5Pset_relax_file_integrity_checks for details.");
+
+ /* Insert the datatype message */
+ if (H5O_msg_append_oh(file, oh, H5O_DTYPE_ID, H5O_MSG_FLAG_CONSTANT | H5O_MSG_FLAG_DONTSHARE,
H5O_UPDATE_TIME, type) < 0)
- HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to update type header message")
+ HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "insert to update type header message")
/* Copy the new object header's location into the datatype, taking ownership of it */
if (H5O_loc_copy_shallow(&(type->oloc), &temp_oloc) < 0)
@@ -407,24 +422,39 @@ H5T__commit(H5F_t *file, H5T_t *type, hid_t tcpl_id)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "cannot mark datatype in memory")
done:
+ if (oh && H5O_unpin(oh) < 0)
+ HDONE_ERROR(H5E_DATATYPE, H5E_CANTUNPIN, FAIL, "unable to unpin object header");
+
if (ret_value < 0) {
- if (loc_init) {
- H5O_loc_free(&temp_oloc);
- H5G_name_free(&temp_path);
- } /* end if */
- if ((type->shared->state == H5T_STATE_TRANSIENT || type->shared->state == H5T_STATE_RDONLY) &&
- (type->sh_loc.type == H5O_SHARE_TYPE_COMMITTED)) {
- if (H5O_dec_rc_by_loc(&(type->oloc)) < 0)
+ /* Close & delete the object header on failure */
+ if (ohdr_created) {
+ H5O_loc_t *oloc_ptr; /* Pointer to object header location */
+
+ /* Point at correct object header location, depending on state when failure occured */
+ if (loc_init)
+ oloc_ptr = &temp_oloc;
+ else
+ oloc_ptr = &(type->oloc);
+ if (H5O_dec_rc_by_loc(oloc_ptr) < 0)
HDONE_ERROR(H5E_DATATYPE, H5E_CANTDEC, FAIL,
"unable to decrement refcount on newly created object")
- if (H5O_close(&(type->oloc), NULL) < 0)
+ if (H5O_close(oloc_ptr, NULL) < 0)
HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "unable to release object header")
- if (H5O_delete(file, type->sh_loc.u.loc.oh_addr) < 0)
+ if (H5O_delete(file, oloc_ptr->addr) < 0)
HDONE_ERROR(H5E_DATATYPE, H5E_CANTDELETE, FAIL, "unable to delete object header")
- type->sh_loc.type = H5O_SHARE_TYPE_UNSHARED;
- } /* end if */
- } /* end if */
+ }
+ /* Release the location info, if the datatype doesn't own it */
+ if (loc_init) {
+ H5O_loc_free(&temp_oloc);
+ H5G_name_free(&temp_path);
+ }
+
+ /* Reset the shared state for the datatype */
+ if ((type->shared->state == H5T_STATE_TRANSIENT || type->shared->state == H5T_STATE_RDONLY) &&
+ (type->sh_loc.type == H5O_SHARE_TYPE_COMMITTED))
+ type->sh_loc.type = H5O_SHARE_TYPE_UNSHARED;
+ }
FUNC_LEAVE_NOAPI(ret_value)
} /* H5T__commit() */