From 5d2e1cc117b38db6bb5dc2e9ae9115304571ac70 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 22 Jul 2024 15:45:46 +0200 Subject: 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. Affected by this are parsing of: - Stored SCRAM secrets ("SCRAM-SHA-256$:$:") - ICU collation attributes ("und@colStrength=primary;colCaseLevel=yes") for ICU older than version 54 - PG_COLORS environment variable ("error=01;31:warning=01;35:note=01;36:locus=01") - pg_regress command-line options with comma-separated list arguments (--dbname, --create-role) (currently only used pg_regress_ecpg) Reviewed-by: Kyotaro Horiguchi Reviewed-by: David Steele Discussion: https://www.postgresql.org/message-id/flat/79692bf9-17d3-41e6-b9c9-fc8c3944222a@eisentraut.org --- src/backend/utils/adt/pg_locale.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/backend/utils') diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 2673bafe60a..38c40a40489 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -2813,6 +2813,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. @@ -2838,7 +2839,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, '='); -- cgit v1.2.3