mirror of
https://github.com/postgres/postgres.git
synced 2025-11-07 19:06:32 +03:00
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$<iterations>:<salt>$<storedkey>:<serverkey>")
- 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 <horikyota.ntt@gmail.com>
Reviewed-by: David Steele <david@pgmasters.net>
Discussion: https://www.postgresql.org/message-id/flat/79692bf9-17d3-41e6-b9c9-fc8c3944222a@eisentraut.org
This commit is contained in:
@@ -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, '=');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user