File Mark-datatype-as-freed-always.patch of Package hdf5.34857

From: Egbert Eich <eich@suse.com>
Date: Fri Jun 7 11:20:01 2024 +0200
Subject: Mark datatype as freed always.
Patch-mainline: Upstream
Git-repo: https://github.com/HDFGroup/hdf5
Git-commit: 9de2d3a5b789d765b093b294a1722fa9d485743a
References: bsc#1224158

Even on error the Copy functions free the source datatype.

This fixes certain fallouts from CVEs.

Signed-off-by: Egbert Eich <eich@suse.com>
Signed-off-by: Egbert Eich <eich@suse.de>
---
 src/H5Olayout.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/src/H5Olayout.c b/src/H5Olayout.c
index 3536648ef0..dcb6760c55 100644
--- a/src/H5Olayout.c
+++ b/src/H5Olayout.c
@@ -1261,10 +1261,10 @@ H5O__layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
         case H5D_COMPACT:
             if (layout_src->storage.u.compact.buf) {
                 /* copy compact raw data */
+		copied = true;
                 if (H5D__compact_copy(file_src, &layout_src->storage.u.compact, file_dst,
                                       &layout_dst->storage.u.compact, udata->src_dtype, cpy_info) < 0)
                     HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy chunked storage")
-		copied = true;
             } /* end if */
             break;
 
@@ -1292,10 +1292,10 @@ H5O__layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
                 (cpy_info->shared_fo &&
                  H5D__contig_is_data_cached((const H5D_shared_t *)cpy_info->shared_fo))) {
                 /* copy contiguous raw data */
+	        copied = true;
                 if (H5D__contig_copy(file_src, &layout_src->storage.u.contig, file_dst,
                                      &layout_dst->storage.u.contig, udata->src_dtype, cpy_info) < 0)
                     HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy contiguous storage")
-		copied = true;
 	        } /* end if */
             } break;
 
@@ -1304,11 +1304,11 @@ H5O__layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
                 (cpy_info->shared_fo &&
                  H5D__chunk_is_data_cached((const H5D_shared_t *)cpy_info->shared_fo))) {
                 /* Create chunked layout */
+		copied = true;
                 if (H5D__chunk_copy(file_src, &layout_src->storage.u.chunk, &layout_src->u.chunk, file_dst,
                                     &layout_dst->storage.u.chunk, udata->src_space_extent, udata->src_dtype,
                                     udata->common.src_pline, cpy_info) < 0)
                     HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy chunked storage")
-		copied = true;
             } /* end if */
             break;
 
@@ -1325,14 +1325,13 @@ H5O__layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
             HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "Invalid layout class")
     } /* end switch */
 
-    /* Check if copy routine was invoked (which frees the source datatype) */
-    if (copied)
-        udata->src_dtype = NULL;
-
     /* Set return value */
     ret_value = layout_dst;
 
 done:
+    /* Check if copy routine was invoked (which frees the source datatype) */
+    if (copied)
+        udata->src_dtype = NULL;
     if (!ret_value)
         if (layout_dst)
             layout_dst = H5FL_FREE(H5O_layout_t, layout_dst);
openSUSE Build Service is sponsored by