summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorjhendersonHDF <jhenderson@hdfgroup.org>2023-08-02 20:19:21 (GMT)
committerGitHub <noreply@github.com>2023-08-02 20:19:21 (GMT)
commitf5c3963c18ef148622d620691dc9d202aa0b95ed (patch)
tree08b6d2e1ede033a7e00ad5fafe0522dd185ffb76 /tools
parent8e9c281cf1858c0835e2b81f6e580132d118dafb (diff)
downloadhdf5-f5c3963c18ef148622d620691dc9d202aa0b95ed.zip
hdf5-f5c3963c18ef148622d620691dc9d202aa0b95ed.tar.gz
hdf5-f5c3963c18ef148622d620691dc9d202aa0b95ed.tar.bz2
Fix h5repack for variable-length datatyped datasets (#3331)
Diffstat (limited to 'tools')
-rw-r--r--tools/src/h5repack/h5repack_copy.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/tools/src/h5repack/h5repack_copy.c b/tools/src/h5repack/h5repack_copy.c
index 0f270c5..81b33c3 100644
--- a/tools/src/h5repack/h5repack_copy.c
+++ b/tools/src/h5repack/h5repack_copy.c
@@ -653,6 +653,7 @@ do_copy_objects(hid_t fidin, hid_t fidout, trav_table_t *travt, pack_opt_t *opti
int ifil;
int is_ref = 0;
htri_t is_named;
+ htri_t is_vlen = 0;
hbool_t limit_maxdims;
hsize_t size_dset;
int ret_value = 0;
@@ -806,6 +807,10 @@ do_copy_objects(hid_t fidin, hid_t fidout, trav_table_t *travt, pack_opt_t *opti
if (H5T_REFERENCE == H5Tget_class(ftype_id))
is_ref = 1;
+ /* early detection of variable-length types */
+ if ((is_vlen = H5Tdetect_class(ftype_id, H5T_VLEN)) < 0)
+ H5TOOLS_GOTO_ERROR((-1), "H5Tdetect_class failed");
+
/* Check if the datatype is committed */
if ((is_named = H5Tcommitted(ftype_id)) < 0)
H5TOOLS_GOTO_ERROR((-1), "H5Tcommitted failed");
@@ -823,10 +828,16 @@ do_copy_objects(hid_t fidin, hid_t fidout, trav_table_t *travt, pack_opt_t *opti
* check if we should use H5Ocopy or not
* if there is a request for filters/layout, we read/write the object
* otherwise we do a copy using H5Ocopy
+ *
+ * Note that H5Ocopy is currently unsafe to use for objects that reside in
+ * or interact with global heaps, such as variable-length datatypes. This
+ * appears to be due to H5Ocopy not correctly translating in the case where
+ * these objects move to different global heap addresses in the repacked
+ * file.
*-------------------------------------------------------------------------
*/
use_h5ocopy = !(options->op_tbl->nelems || options->all_filter == 1 ||
- options->all_layout == 1 || is_ref || is_named);
+ options->all_layout == 1 || is_ref || is_vlen || is_named);
/*
* Check if we are using different source and destination VOL connectors.