From 84552ffcb856eeb1be9f6c3a07e3b4ba0337ec84 Mon Sep 17 00:00:00 2001 From: Christiano Haesbaert Date: Thu, 24 Jul 2025 15:47:52 +0200 Subject: [PATCH] Fix utils not detecting symbols and add strtok_r strtok(3) is not re-entrant, use strtok_r(3), since windows doesn't have it, guard it under HAVE_STRTOK_R on the same scheme as HAVE_STRNCPY. While adding HAVE_STRTOK_R I noticed utils.c was not including config.h, which also made the HAVE_STRNCPY test fail, so fix it as well. --- kubernetes/ConfigureChecks.cmake | 1 + kubernetes/config.h.in | 3 ++- .../authn_plugin/plugins/oidc/libkubernetes_oidc.c | 13 ++++++++++++- kubernetes/src/utils.c | 1 + kubernetes/watch/watch_util.c | 12 ++++++++++++ 5 files changed, 28 insertions(+), 2 deletions(-) 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..cd64f94a 100644 --- a/kubernetes/config/authn_plugin/plugins/oidc/libkubernetes_oidc.c +++ b/kubernetes/config/authn_plugin/plugins/oidc/libkubernetes_oidc.c @@ -1,3 +1,4 @@ +#include "config.h" #include "authn_plugin.h" #include "authn_plugin_util.h" #include "kube_config_util.h" @@ -41,12 +42,22 @@ 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 */ +#ifdef HAVE_STRTOK_R + char *last = NULL; + + p = strtok_r(dup_token_string, OIDC_ID_TOKEN_DELIM, &last); /* jwt header */ +#else + p = strtok(dup_token_string, OIDC_ID_TOKEN_DELIM); +#endif if (!p) { fprintf(stderr, "%s: The token <%s> is not a valid JWT token.\n", fname, token_string); goto end; } +#ifdef HAVE_STRTOK_R + p = strtok_r(NULL, OIDC_ID_TOKEN_DELIM, &last); /* jwt part2 */ +#else p = strtok(NULL, OIDC_ID_TOKEN_DELIM); /* jwt part2 */ +#endif if (!p) { fprintf(stderr, "%s: The token <%s> is not a valid JWT token.\n", fname, token_string); goto end; diff --git a/kubernetes/src/utils.c b/kubernetes/src/utils.c index 14d5242f..f8cfee29 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) diff --git a/kubernetes/watch/watch_util.c b/kubernetes/watch/watch_util.c index 401544a1..c948ee5e 100644 --- a/kubernetes/watch/watch_util.c +++ b/kubernetes/watch/watch_util.c @@ -3,6 +3,7 @@ #include #include #include +#include "config.h" #include "../include/list.h" #include "watch_util.h" @@ -18,7 +19,14 @@ 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; +#ifdef HAVE_STRTOK_R + char *last = NULL; + + token = strtok_r(json_string_dup, JSON_ARRAY_DELIM, &last); +#else token = strtok(json_string_dup, JSON_ARRAY_DELIM); +#endif + while (token) { cJSON *cjson = cJSON_Parse(token); if (cjson == NULL) { @@ -27,7 +35,11 @@ static int wu_convert_to_json_array(list_t * json_array, const char *json_string } cJSON_Delete(cjson); list_addElement(json_array, strdup(token)); +#ifdef HAVE_STRTOK_R + token = strtok_r(NULL, JSON_ARRAY_DELIM, &last); +#else token = strtok(NULL, JSON_ARRAY_DELIM); +#endif } end: