summaryrefslogtreecommitdiffstats
path: root/test/tmisc.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2008-01-13 05:37:00 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2008-01-13 05:37:00 (GMT)
commitd6e767c21d28c9295e24dfedcbcf17c2d18006b8 (patch)
treedb928b7453fdb67016a72f1c737434166d6e773b /test/tmisc.c
parentd9bc27b53521042e9fd648e9c0f0318d0bca4631 (diff)
downloadhdf5-d6e767c21d28c9295e24dfedcbcf17c2d18006b8.zip
hdf5-d6e767c21d28c9295e24dfedcbcf17c2d18006b8.tar.gz
hdf5-d6e767c21d28c9295e24dfedcbcf17c2d18006b8.tar.bz2
[svn-r14402] Description:
Add work-around to allow reading files that were produced with a buggy earlier version of the library, which could create objects with the wrong object header message count. There is now a configure flag "--enable-strict-format-checks" which triggers a failure on reading a file with this sort of corruption (when enabled) and allows the object to be read (when disabled). The default value for the "strict-format-checks" flag is yes when the "debug" flag is enabled and no when the "debug" flag is disabled. Note that if strict format checks are disabled (allowing objects with this particular kind of corruption to be read) and the file is opened with write access, the library will re-write the object header for the corrupt object with the correct # of object header messages. This closes bugzilla bug #1010. Tested on: FreeBSD/32 6.2 (duty) in debug mode FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe, in debug mode Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN, in production mode Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN, in production mode Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN, w/szip filter, in production mode Mac OS X/32 10.4.10 (amazon) in debug mode Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in production mode
Diffstat (limited to 'test/tmisc.c')
-rw-r--r--test/tmisc.c61
1 files changed, 60 insertions, 1 deletions
diff --git a/test/tmisc.c b/test/tmisc.c
index cc4e5ec..915407c 100644
--- a/test/tmisc.c
+++ b/test/tmisc.c
@@ -295,6 +295,11 @@ unsigned m13_rdata[MISC13_DIM1][MISC13_DIM2]; /* Data read from dataset
/* Definitions for misc. test #26 */
#define MISC26_FILE "dcpl_file"
+/* Definitions for misc. test #27 */
+/* (Note that this test file is generated by the "gen_bad_ohdr.c" code) */
+#define MISC27_FILE "tbad_msg_count.h5"
+#define MISC27_GROUP "Group"
+
/****************************************************************
**
** test_misc1(): test unlinking a dataset from a group and immediately
@@ -1709,7 +1714,7 @@ test_misc10(void)
hid_t dcpl; /* Dataset creation property list */
hid_t space, type; /* Old dataset's dataspace & datatype */
char testfile[512]=""; /* Character buffer for corrected test file name */
- char *srcdir = getenv("srcdir"); /* Pointer to the directory the source code is located within */
+ char *srcdir = HDgetenv("srcdir"); /* Pointer to the directory the source code is located within */
herr_t ret;
/* Output message about test being performed */
@@ -4796,6 +4801,59 @@ test_misc26(void)
CHECK_I(ret, "H5Pclose");
}
+
+/****************************************************************
+**
+** test_misc27(): Ensure that objects with incorrect # of object
+** header messages are handled appropriately.
+**
+** (Note that this test file is generated by the "gen_bad_ohdr.c" code)
+**
+****************************************************************/
+static void
+test_misc27(void)
+{
+ hid_t fid; /* File ID */
+ hid_t gid; /* Group ID */
+ char testfile[512]=""; /* Character buffer for corrected test file name */
+ char *srcdir = HDgetenv("srcdir"); /* Pointer to the directory the source code is located within */
+ herr_t ret; /* Generic return value */
+
+ /* Output message about test being performed */
+ MESSAGE(5, ("Corrupt object header handling\n"));
+
+ /* Generate the correct name for the test file, by prepending the source path */
+ if(srcdir && ((HDstrlen(srcdir) + HDstrlen(MISC27_FILE) + 1) < sizeof(testfile))) {
+ HDstrcpy(testfile, srcdir);
+ HDstrcat(testfile, "/");
+ }
+ HDstrcat(testfile, MISC27_FILE);
+
+ /* Open the file */
+ fid = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT);
+ CHECK(fid, FAIL, "H5Fopen");
+
+#ifdef H5_STRICT_FORMAT_CHECKS
+ /* Open group with incorrect # of object header messages (should fail) */
+ H5E_BEGIN_TRY {
+ gid = H5Gopen2(fid, MISC27_GROUP, H5P_DEFAULT);
+ } H5E_END_TRY;
+ VERIFY(gid, FAIL, "H5Gopen2");
+#else /* H5_STRICT_FORMAT_CHECKS */
+ /* Open group with incorrect # of object header messages */
+ gid = H5Gopen2(fid, MISC27_GROUP, H5P_DEFAULT);
+ CHECK(gid, FAIL, "H5Gopen2");
+
+ /* Close group */
+ ret = H5Gclose(gid);
+ CHECK(ret, FAIL, "H5Gclose");
+#endif /* H5_STRICT_FORMAT_CHECKS */
+
+ /* Close file */
+ ret = H5Fclose(fid);
+ CHECK(ret, FAIL, "H5Fclose");
+} /* end test_misc27() */
+
/****************************************************************
**
** test_misc(): Main misc. test routine.
@@ -4837,6 +4895,7 @@ test_misc(void)
test_misc25b(); /* Exercise null object header message merge bug on existing file */
test_misc25c(); /* Exercise another null object header message merge bug */
test_misc26(); /* Test closing property lists with long filter pipelines */
+ test_misc27(); /* Test opening file with object that has bad # of object header messages */
} /* test_misc() */