summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorraylu-hdf <60487644+raylu-hdf@users.noreply.github.com>2022-11-17 22:29:21 (GMT)
committerGitHub <noreply@github.com>2022-11-17 22:29:21 (GMT)
commitee4d92e01bd7a48624af7a8a811faea00724daff (patch)
tree28df5f8df1ea1ed0504d42ad9afc5a5f540e5071 /test
parent9dd36f016a4316b94f5df15856d228de01d304c6 (diff)
downloadhdf5-ee4d92e01bd7a48624af7a8a811faea00724daff.zip
hdf5-ee4d92e01bd7a48624af7a8a811faea00724daff.tar.gz
hdf5-ee4d92e01bd7a48624af7a8a811faea00724daff.tar.bz2
Bug Fix: Segfault in H5CX_get_vol_wrap_ctx when H5VLwrap_register is called from an application (#2248)
* Jira HDFFV-10881: Segfault in H5CX_get_vol_wrap_ctx when H5VLwrap_register is called from an application. A quick and simple fix to make it fail with a relevant error message. * Format changes. * Committing clang-format changes * Minor change: split one condition check into two for clarity. * Adding doxygen comment for H5VLwrap_register. * Minor change: adding a little more detail to the Doxygen comment for H5VLwrap_register.
Diffstat (limited to 'test')
-rw-r--r--test/vol.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/test/vol.c b/test/vol.c
index 7028497..d369669 100644
--- a/test/vol.c
+++ b/test/vol.c
@@ -2290,6 +2290,81 @@ error:
} /* end test_vol_cap_flags() */
/*-------------------------------------------------------------------------
+ * Function: test_wrap_register()
+ *
+ * Purpose: Tests the failure of calling H5VLwrap_register in application
+ *
+ * Return: SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_wrap_register(void)
+{
+ hid_t fapl_id = H5I_INVALID_HID;
+ hid_t file_id = H5I_INVALID_HID;
+ hid_t group_id = H5I_INVALID_HID;
+ hid_t wrap_id = H5I_INVALID_HID;
+ char filename[NAME_LEN];
+ void *vol_obj;
+
+ TESTING("failure of calling H5VLwrap_register");
+
+ /* Retrieve the file access property for testing */
+ fapl_id = h5_fileaccess();
+
+ h5_fixname(FILENAME[0], fapl_id, filename, sizeof filename);
+
+ if ((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0)
+ TEST_ERROR;
+
+ if ((group_id = H5Gcreate2(file_id, "test", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ TEST_ERROR;
+
+ /* Retrieve the VOL object for the group */
+ if (!(vol_obj = H5VLobject(group_id)))
+ TEST_ERROR;
+
+ /* Try to register a second ID for the group. It should fail because this routine is mainly
+ * targeted toward wrapping objects for iteration routine callbacks, not for application use
+ */
+ H5E_BEGIN_TRY
+ {
+ wrap_id = H5VLwrap_register(vol_obj, H5I_GROUP);
+ }
+ H5E_END_TRY;
+
+ if (H5I_INVALID_HID != wrap_id)
+ FAIL_PUTS_ERROR("should not be able to call H5VLwrap_register in an application");
+
+ if (H5Gclose(group_id) < 0)
+ TEST_ERROR;
+
+ if (H5Fclose(file_id) < 0)
+ TEST_ERROR;
+
+ h5_delete_test_file(FILENAME[0], fapl_id);
+
+ if (H5Pclose(fapl_id) < 0)
+ TEST_ERROR;
+
+ PASSED();
+
+ return SUCCEED;
+
+error:
+ H5E_BEGIN_TRY
+ {
+ H5Gclose(group_id);
+ H5Fclose(file_id);
+ H5Pclose(fapl_id);
+ }
+ H5E_END_TRY;
+
+ return FAIL;
+} /* end test_wrap_register() */
+
+/*-------------------------------------------------------------------------
* Function: main
*
* Purpose: Tests the virtual object layer interface (H5VL)
@@ -2326,6 +2401,7 @@ main(void)
nerrors += test_async_vol_props() < 0 ? 1 : 0;
nerrors += test_vol_cap_flags() < 0 ? 1 : 0;
nerrors += test_get_vol_name() < 0 ? 1 : 0;
+ nerrors += test_wrap_register() < 0 ? 1 : 0;
if (nerrors) {
HDprintf("***** %d Virtual Object Layer TEST%s FAILED! *****\n", nerrors, nerrors > 1 ? "S" : "");