diff --git a/kubernetes/ConfigureChecks.cmake b/kubernetes/ConfigureChecks.cmake index 0e63728f..c34df264 100644 --- a/kubernetes/ConfigureChecks.cmake +++ b/kubernetes/ConfigureChecks.cmake @@ -3,3 +3,4 @@ include(CheckSymbolExists) check_symbol_exists(strndup "string.h" HAVE_STRNDUP) check_symbol_exists(secure_getenv "stdlib.h" HAVE_SECURE_GETENV) check_symbol_exists(getenv "stdlib.h" HAVE_GETENV) +check_symbol_exists(strtok_r "string.h" HAVE_STRTOK_R) diff --git a/kubernetes/config.h.in b/kubernetes/config.h.in index 35cba3c9..24de7ce7 100644 --- a/kubernetes/config.h.in +++ b/kubernetes/config.h.in @@ -1,3 +1,4 @@ #cmakedefine HAVE_STRNDUP #cmakedefine HAVE_SECURE_GETENV -#cmakedefine HAVE_GETENV \ No newline at end of file +#cmakedefine HAVE_GETENV +#cmakedefine HAVE_STRTOK_R diff --git a/kubernetes/config/authn_plugin/plugins/oidc/libkubernetes_oidc.c b/kubernetes/config/authn_plugin/plugins/oidc/libkubernetes_oidc.c index bffd3c6d..9bd77783 100644 --- a/kubernetes/config/authn_plugin/plugins/oidc/libkubernetes_oidc.c +++ b/kubernetes/config/authn_plugin/plugins/oidc/libkubernetes_oidc.c @@ -41,12 +41,13 @@ static time_t get_token_expiration_time(const char *token_string) } char *p = NULL; - p = strtok(dup_token_string, OIDC_ID_TOKEN_DELIM); /* jwt header */ + char *last = NULL; + p = strtok_r(dup_token_string, OIDC_ID_TOKEN_DELIM, &last); /* jwt header */ if (!p) { fprintf(stderr, "%s: The token <%s> is not a valid JWT token.\n", fname, token_string); goto end; } - p = strtok(NULL, OIDC_ID_TOKEN_DELIM); /* jwt part2 */ + p = strtok_r(NULL, OIDC_ID_TOKEN_DELIM, &last); /* jwt part2 */ if (!p) { fprintf(stderr, "%s: The token <%s> is not a valid JWT token.\n", fname, token_string); goto end; diff --git a/kubernetes/include/utils.h b/kubernetes/include/utils.h index 57786260..d342b961 100644 --- a/kubernetes/include/utils.h +++ b/kubernetes/include/utils.h @@ -9,6 +9,10 @@ extern "C" { char *strndup(const char *s, size_t n); #endif /* ! HAVE_STRNDUP */ +#if !defined(HAVE_STRTOK_R) +char *strtok_r(char *str, const char *delim, char **saveptr); +#endif /* ! HAVE_STRTOK_R */ + #ifdef __cplusplus } #endif diff --git a/kubernetes/src/utils.c b/kubernetes/src/utils.c index 14d5242f..c92a60ee 100644 --- a/kubernetes/src/utils.c +++ b/kubernetes/src/utils.c @@ -1,6 +1,7 @@ #include #include "../include/utils.h" #include +#include "config.h" // based on https://github.com/libssh/libssh-mirror/commit/247983e9820fd264cb5a59c14cc12846c028bd08#diff-744295d01685fa411dbfd78679ea20b51dfa4ac7d2d722df53f3d86d728493f8 #if !defined(HAVE_STRNDUP) @@ -22,4 +23,11 @@ char *strndup(const char *s, size_t n) return x; } -#endif /* ! HAVE_STRNDUP */ \ No newline at end of file +#endif /* ! HAVE_STRNDUP */ + +#if !defined(HAVE_STRTOK_R) +char *strtok_r(char *str, const char *delim, char **saveptr) +{ + return strtok(str, delim); +} +#endif /* ! HAVE_STRTOK_R */ diff --git a/kubernetes/watch/watch_util.c b/kubernetes/watch/watch_util.c index 401544a1..3934d655 100644 --- a/kubernetes/watch/watch_util.c +++ b/kubernetes/watch/watch_util.c @@ -10,6 +10,8 @@ static int wu_convert_to_json_array(list_t * json_array, const char *json_string) { + char *last = NULL; + if (!json_string || '\0' == json_string[0] || !json_array) { return -1; } @@ -18,7 +20,7 @@ static int wu_convert_to_json_array(list_t * json_array, const char *json_string char *json_string_dup = strdup(json_string); char *token = NULL; - token = strtok(json_string_dup, JSON_ARRAY_DELIM); + token = strtok_r(json_string_dup, JSON_ARRAY_DELIM, &last); while (token) { cJSON *cjson = cJSON_Parse(token); if (cjson == NULL) { @@ -27,7 +29,7 @@ static int wu_convert_to_json_array(list_t * json_array, const char *json_string } cJSON_Delete(cjson); list_addElement(json_array, strdup(token)); - token = strtok(NULL, JSON_ARRAY_DELIM); + token = strtok_r(NULL, JSON_ARRAY_DELIM, &last); } end: