summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Young <dyoung@hdfgroup.org>2020-04-13 17:10:02 (GMT)
committerDavid Young <dyoung@hdfgroup.org>2020-04-13 17:10:02 (GMT)
commit1ce8ff1fea6b87732dc8a4acf2c995bb3fb6ea92 (patch)
tree3747cb9b67ba0190bdc72f0aff78fb8cfbea183b /src
parent8ec3ad3d93c31d1ab8766fddd7190e2843d059d3 (diff)
downloadhdf5-1ce8ff1fea6b87732dc8a4acf2c995bb3fb6ea92.zip
hdf5-1ce8ff1fea6b87732dc8a4acf2c995bb3fb6ea92.tar.gz
hdf5-1ce8ff1fea6b87732dc8a4acf2c995bb3fb6ea92.tar.bz2
Check whether or not the shadow entry size is different from the
pagebuffer entry size. If the sizes are different, then release the old shadow space (using the correct size) and set the shadow page number to 0 so that H5F_update_vfd_swmr_metadata_file() will allocate new shadow space with the right size. Vailin says that this fixes the bug she found, where a 4096-byte buffer allocated by H5MV_alloc() is released with H5MV_free() as if it was 8192 bytes long.
Diffstat (limited to 'src')
-rw-r--r--src/H5PB.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/H5PB.c b/src/H5PB.c
index 7d4122a..e536c58 100644
--- a/src/H5PB.c
+++ b/src/H5PB.c
@@ -1745,14 +1745,27 @@ H5PB_vfd_swmr__update_index(H5F_t *f,
ie_ptr->delayed_flush = entry->delay_write_until;
ie_ptr->moved_to_lower_file = false;
ie_ptr->garbage = false;
+ ie_ptr->length = (uint32_t)entry->size;
} else {
+ /* If entry->size changed, discard the too-small (too-big?)
+ * shadow region and set the shadow-file page number to 0
+ * so that H5F_update_vfd_swmr_metadata_file() will
+ * allocate a new one.
+ */
+ if (ie_ptr->length != (uint32_t)entry->size) {
+ int ret;
+
+ ret = shadow_image_defer_free(shared, ie_ptr);
+ HDassert(ret == 0);
+
+ ie_ptr->md_file_page_offset = 0;
+ ie_ptr->length = (uint32_t)entry->size;
+ }
idx_ent_modified++;
}
- /* entry->size could have changed */
- ie_ptr->length = (uint32_t)entry->size;
ie_ptr->entry_ptr = entry->image_ptr;
ie_ptr->tick_of_last_change = tick_num;
assert(entry->is_dirty);