summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2018-12-13 23:31:00 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2018-12-13 23:31:00 (GMT)
commit247a6afb7e7fb1bc08a31cb7edbbea5f5b44eb93 (patch)
treed1333820e27591777081f167140313091b5afb73
parentafdf3094cc6577bacd004f2cb4b553b63bf503f7 (diff)
downloadhdf5-247a6afb7e7fb1bc08a31cb7edbbea5f5b44eb93.zip
hdf5-247a6afb7e7fb1bc08a31cb7edbbea5f5b44eb93.tar.gz
hdf5-247a6afb7e7fb1bc08a31cb7edbbea5f5b44eb93.tar.bz2
Fix plugin code from referencing invalid key ID value, and also switch from
strtok() to strtok_r() to avoid possible interference with / to application use of strtok().
-rw-r--r--src/H5PLint.c2
-rw-r--r--src/H5PLpath.c10
-rw-r--r--src/H5PLpkg.h2
-rw-r--r--src/H5PLplugin_cache.c2
-rw-r--r--src/H5private.h3
-rw-r--r--test/h5test.c15
6 files changed, 20 insertions, 14 deletions
diff --git a/src/H5PLint.c b/src/H5PLint.c
index bbe71fe..ded315a 100644
--- a/src/H5PLint.c
+++ b/src/H5PLint.c
@@ -262,7 +262,7 @@ H5PL_load(H5PL_type_t type, const H5PL_key_t *key)
/* Set up the search parameters */
search_params.type = type;
- search_params.key.id = key->id;
+ search_params.key = key;
/* Search in the table of already loaded plugin libraries */
if(H5PL__find_plugin_in_cache(&search_params, &found, &plugin_info) < 0)
diff --git a/src/H5PLpath.c b/src/H5PLpath.c
index d53007b..04248b5 100644
--- a/src/H5PLpath.c
+++ b/src/H5PLpath.c
@@ -242,6 +242,7 @@ H5PL__create_path_table(void)
* environment variable or the default.
*/
char *next_path = NULL; /* A path tokenized from the paths string */
+ char *lasts = NULL; /* Context pointer for strtok_r() call */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
@@ -265,8 +266,7 @@ H5PL__create_path_table(void)
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path copy")
/* Separate the paths and store them */
- /* XXX: strtok() is not thread-safe */
- next_path = HDstrtok(paths, H5PL_PATH_SEPARATOR);
+ next_path = HDstrtok_r(paths, H5PL_PATH_SEPARATOR, &lasts);
while (next_path) {
/* Insert the path into the table */
@@ -274,7 +274,7 @@ H5PL__create_path_table(void)
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't insert path: %s", next_path)
/* Get the next path from the environment string */
- next_path = HDstrtok(NULL, H5PL_PATH_SEPARATOR);
+ next_path = HDstrtok_r(NULL, H5PL_PATH_SEPARATOR, &lasts);
} /* end while */
done:
@@ -689,7 +689,7 @@ H5PL__find_plugin_in_path(const H5PL_search_params_t *search_params, hbool_t *fo
continue;
/* attempt to open the dynamic library as a filter library */
- if (H5PL__open(path, search_params->type, &(search_params->key), found, plugin_info) < 0)
+ if (H5PL__open(path, search_params->type, search_params->key, found, plugin_info) < 0)
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "search in directory failed")
if (*found)
HGOTO_DONE(SUCCEED)
@@ -755,7 +755,7 @@ H5PL__find_plugin_in_path(const H5PL_search_params_t *search_params, hbool_t *fo
continue;
/* attempt to open the dynamic library as a filter library */
- if (H5PL__open(path, search_params->type, &(search_params->key), found, plugin_info) < 0)
+ if (H5PL__open(path, search_params->type, search_params->key, found, plugin_info) < 0)
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "search in directory failed")
if (*found)
HGOTO_DONE(SUCCEED)
diff --git a/src/H5PLpkg.h b/src/H5PLpkg.h
index d60da82..c3ad8f5 100644
--- a/src/H5PLpkg.h
+++ b/src/H5PLpkg.h
@@ -116,7 +116,7 @@
/* Data used to search for plugins */
typedef struct H5PL_search_params_t {
H5PL_type_t type;
- H5PL_key_t key;
+ const H5PL_key_t *key;
} H5PL_search_params_t;
diff --git a/src/H5PLplugin_cache.c b/src/H5PLplugin_cache.c
index 7fe676d..cd0b4d6 100644
--- a/src/H5PLplugin_cache.c
+++ b/src/H5PLplugin_cache.c
@@ -276,7 +276,7 @@ H5PL__find_plugin_in_cache(const H5PL_search_params_t *search_params, hbool_t *f
for (u = 0; u < H5PL_num_plugins_g; u++) {
/* If the plugin type (filter, etc.) and ID match, query the plugin for its info */
- if ((search_params->type == (H5PL_cache_g[u]).type) && (search_params->key.id == (H5PL_cache_g[u]).key.id)) {
+ if ((search_params->type == (H5PL_cache_g[u]).type) && (search_params->key->id == (H5PL_cache_g[u]).key.id)) {
H5PL_get_plugin_info_t get_plugin_info_function;
const H5Z_class2_t *filter_info;
diff --git a/src/H5private.h b/src/H5private.h
index b654bae..f48fa7b 100644
--- a/src/H5private.h
+++ b/src/H5private.h
@@ -1393,6 +1393,9 @@ typedef off_t h5_stat_size_t;
#ifndef HDstrtok
#define HDstrtok(X,Y) strtok(X,Y)
#endif /* HDstrtok */
+#ifndef HDstrtok_r
+ #define HDstrtok_r(X,Y,Z) strtok_r(X,Y,Z)
+#endif /* HDstrtok */
#ifndef HDstrtol
#define HDstrtol(S,R,N) strtol(S,R,N)
#endif /* HDstrtol */
diff --git a/test/h5test.c b/test/h5test.c
index 0805f06..6aad76a 100644
--- a/test/h5test.c
+++ b/test/h5test.c
@@ -855,6 +855,7 @@ h5_get_vfd_fapl(hid_t fapl)
{
const char *env = NULL; /* HDF5_DRIVER environment variable */
const char *tok = NULL; /* strtok pointer */
+ char *lasts = NULL; /* Context pointer for strtok_r() call */
char buf[1024]; /* buffer for tokenizing HDF5_DRIVER */
/* Get the environment variable, if it exists */
@@ -877,7 +878,7 @@ h5_get_vfd_fapl(hid_t fapl)
*/
HDstrncpy(buf, env, sizeof(buf));
buf[sizeof(buf) - 1] = '\0';
- if(NULL == (tok = HDstrtok(buf, " \t\n\r")))
+ if(NULL == (tok = HDstrtok_r(buf, " \t\n\r", &lasts)))
goto done;
if(!HDstrcmp(tok, "sec2")) {
@@ -936,7 +937,7 @@ h5_get_vfd_fapl(hid_t fapl)
hsize_t fam_size = 100 * 1024 * 1024; /* 100 MB */
/* Was a family size specified in the environment variable? */
- if((tok = HDstrtok(NULL, " \t\n\r")))
+ if((tok = HDstrtok_r(NULL, " \t\n\r", &lasts)))
fam_size = (hsize_t)(HDstrtod(tok, NULL) * 1024 * 1024);
if(H5Pset_fapl_family(fapl, fam_size, H5P_DEFAULT) < 0)
goto error;
@@ -945,7 +946,7 @@ h5_get_vfd_fapl(hid_t fapl)
unsigned log_flags = H5FD_LOG_LOC_IO | H5FD_LOG_ALLOC;
/* Were special log file flags specified in the environment variable? */
- if((tok = HDstrtok(NULL, " \t\n\r")))
+ if((tok = HDstrtok_r(NULL, " \t\n\r", &lasts)))
log_flags = (unsigned)HDstrtol(tok, NULL, 0);
if(H5Pset_fapl_log(fapl, NULL, log_flags, (size_t)0) < 0)
@@ -990,6 +991,7 @@ h5_get_libver_fapl(hid_t fapl)
{
const char *env = NULL; /* HDF5_DRIVER environment variable */
const char *tok = NULL; /* strtok pointer */
+ char *lasts = NULL; /* Context pointer for strtok_r() call */
char buf[1024]; /* buffer for tokenizing HDF5_DRIVER */
/* Get the environment variable, if it exists */
@@ -1012,7 +1014,7 @@ h5_get_libver_fapl(hid_t fapl)
*/
HDstrncpy(buf, env, sizeof(buf));
buf[sizeof(buf) - 1] = '\0';
- if(NULL == (tok = HDstrtok(buf, " \t\n\r")))
+ if(NULL == (tok = HDstrtok_r(buf, " \t\n\r", &lasts)))
goto done;
if(!HDstrcmp(tok, "latest")) {
@@ -1053,6 +1055,7 @@ h5_get_vol_fapl(hid_t fapl)
{
const char *env = NULL;
const char *tok = NULL;
+ char *lasts = NULL; /* Context pointer for strtok_r() call */
htri_t connector_is_registered;
char buf[1024]; /* Buffer for tokenizing HDF5_VOL_CONNECTOR */
void *vol_info = NULL; /* VOL connector info */
@@ -1075,7 +1078,7 @@ h5_get_vol_fapl(hid_t fapl)
*/
HDstrncpy(buf, env, sizeof(buf));
buf[sizeof(buf) - 1] = '\0';
- if(NULL == (tok = HDstrtok(buf, " \t\n\r")))
+ if(NULL == (tok = HDstrtok_r(buf, " \t\n\r", &lasts)))
goto done;
/* First, check to see if the connector is already registered */
@@ -1105,7 +1108,7 @@ h5_get_vol_fapl(hid_t fapl)
} /* end else */
/* Was there any connector info specified in the environment variable? */
- if(NULL != (tok = HDstrtok(NULL, " \t\n\r")))
+ if(NULL != (tok = HDstrtok_r(NULL, " \t\n\r", &lasts)))
if(H5VLconnector_str_to_info(tok, connector_id, &vol_info) < 0)
goto error;