summaryrefslogtreecommitdiffstats
path: root/src/H5Fsuper.c
diff options
context:
space:
mode:
authorRaymond Lu <songyulu@hdfgroup.org>2009-03-24 22:06:07 (GMT)
committerRaymond Lu <songyulu@hdfgroup.org>2009-03-24 22:06:07 (GMT)
commitffd0fddad2117675ffb80a4bb0da4c0e5d0a3112 (patch)
tree05e675f4e0c188697e8500f9c4226ffac9e556a4 /src/H5Fsuper.c
parentfdedcd9ceb2b9d58ad0cf1ef29a593e824fca81e (diff)
downloadhdf5-ffd0fddad2117675ffb80a4bb0da4c0e5d0a3112.zip
hdf5-ffd0fddad2117675ffb80a4bb0da4c0e5d0a3112.tar.gz
hdf5-ffd0fddad2117675ffb80a4bb0da4c0e5d0a3112.tar.bz2
[svn-r16609] Bug fix (#1161): When a family file created with v1.6 library is opened and closed with
v1.8 library, v1.8 library writes the driver info block in the superblock. But v1.6 doesn't write it. This caused the data after the superblock to be overwritten. The solution is to use a flag to indicate when the original file doesn't have the driver info, v1.8 library doesn't write it either. Tested on jam. I have some trouble to access smirom and linew using h5committest.
Diffstat (limited to 'src/H5Fsuper.c')
-rw-r--r--src/H5Fsuper.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/H5Fsuper.c b/src/H5Fsuper.c
index 70e0954..69c7a8d 100644
--- a/src/H5Fsuper.c
+++ b/src/H5Fsuper.c
@@ -466,6 +466,16 @@ H5F_super_read(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc)
if(H5FD_sb_decode(lf, drv_name, p) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to decode driver information")
} /* end if */
+ else
+ /* This flag is false only if a file was created with v1.6 library or
+ * before and no driver info was saved in the superblock. When the file is
+ * closed and superblock is written to the file, v1.8 library or after
+ * doesn't write the driver info in the superblock. Otherwise, the newly
+ * added driver block will overwrite the (meta)data right after the
+ * superblock. SLU - 2009/3/24
+ */
+ shared->write_driver = FALSE;
+
} /* end if */
else {
haddr_t root_addr; /* Address of root group */
@@ -934,7 +944,7 @@ H5F_super_write(H5F_t *f, hid_t dxpl_id)
/* Encode the driver information block. */
H5_ASSIGN_OVERFLOW(driver_size, H5FD_sb_size(f->shared->lf), hsize_t, size_t);
- if(driver_size > 0) {
+ if(driver_size > 0 && f->shared->write_driver) {
char driver_name[9]; /* Name of driver, for driver info block */
uint8_t *dbuf = p; /* Pointer to beginning of driver info */