diff options
author | jhendersonHDF <jhenderson@hdfgroup.org> | 2023-08-02 20:19:21 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-02 20:19:21 (GMT) |
commit | f5c3963c18ef148622d620691dc9d202aa0b95ed (patch) | |
tree | 08b6d2e1ede033a7e00ad5fafe0522dd185ffb76 /tools | |
parent | 8e9c281cf1858c0835e2b81f6e580132d118dafb (diff) | |
download | hdf5-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.c | 13 |
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. |