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() */
 
openSUSE Build Service is sponsored by