mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-11-27 02:10:55 +08:00
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().
This commit is contained in:
parent
afdf3094cc
commit
247a6afb7e
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user