From 8ab537885f007d8bed58f839ca91108ef20422a6 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 10 Jun 2024 16:08:08 +0200 Subject: [PATCH v1 1/4] Replace some strtok() with strsep() strtok() considers adjacent delimiters to be one delimiter, which is arguably the wrong behavior in some cases. Replace with strsep(), which has the right behavior: Adjacent delimiters create an empty token. --- src/backend/libpq/auth-scram.c | 11 +++++------ src/backend/utils/adt/pg_locale.c | 3 ++- src/common/logging.c | 4 +++- src/test/regress/pg_regress.c | 5 ++--- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/backend/libpq/auth-scram.c b/src/backend/libpq/auth-scram.c index 41619599148..03ddddc3c27 100644 --- a/src/backend/libpq/auth-scram.c +++ b/src/backend/libpq/auth-scram.c @@ -608,16 +608,15 @@ parse_scram_secret(const char *secret, int *iterations, * SCRAM-SHA-256$:$: */ v = pstrdup(secret); - if ((scheme_str = strtok(v, "$")) == NULL) + if ((scheme_str = strsep(&v, "$")) == NULL) goto invalid_secret; - if ((iterations_str = strtok(NULL, ":")) == NULL) + if ((iterations_str = strsep(&v, ":")) == NULL) goto invalid_secret; - if ((salt_str = strtok(NULL, "$")) == NULL) + if ((salt_str = strsep(&v, "$")) == NULL) goto invalid_secret; - if ((storedkey_str = strtok(NULL, ":")) == NULL) - goto invalid_secret; - if ((serverkey_str = strtok(NULL, "")) == NULL) + if ((storedkey_str = strsep(&v, ":")) == NULL) goto invalid_secret; + serverkey_str = v; /* Parse the fields */ if (strcmp(scheme_str, "SCRAM-SHA-256") != 0) diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 7e5bb2b703a..21924d89877 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -2809,6 +2809,7 @@ icu_set_collation_attributes(UCollator *collator, const char *loc, char *icu_locale_id; char *lower_str; char *str; + char *token; /* * The input locale may be a BCP 47 language tag, e.g. @@ -2834,7 +2835,7 @@ icu_set_collation_attributes(UCollator *collator, const char *loc, return; str++; - for (char *token = strtok(str, ";"); token; token = strtok(NULL, ";")) + while ((token = strsep(&str, ";"))) { char *e = strchr(token, '='); diff --git a/src/common/logging.c b/src/common/logging.c index e9a02e3e46a..aedd1ae2d8c 100644 --- a/src/common/logging.c +++ b/src/common/logging.c @@ -119,7 +119,9 @@ pg_logging_init(const char *argv0) if (colors) { - for (char *token = strtok(colors, ":"); token; token = strtok(NULL, ":")) + char *token; + + while ((token = strsep(&colors, ":"))) { char *e = strchr(token, '='); diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c index 06f6775fc65..1abfe6c4a5c 100644 --- a/src/test/regress/pg_regress.c +++ b/src/test/regress/pg_regress.c @@ -234,12 +234,11 @@ static void split_to_stringlist(const char *s, const char *delim, _stringlist **listhead) { char *sc = pg_strdup(s); - char *token = strtok(sc, delim); + char *token; - while (token) + while ((token = strsep(&sc, delim))) { add_stringlist_item(listhead, token); - token = strtok(NULL, delim); } free(sc); } base-commit: ae482a7ec521e09bb0dbfc261da6e6170a5ac29f -- 2.45.2