mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +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:
@ -608,16 +608,15 @@ parse_scram_secret(const char *secret, int *iterations,
|
|||||||
* SCRAM-SHA-256$<iterations>:<salt>$<storedkey>:<serverkey>
|
* SCRAM-SHA-256$<iterations>:<salt>$<storedkey>:<serverkey>
|
||||||
*/
|
*/
|
||||||
v = pstrdup(secret);
|
v = pstrdup(secret);
|
||||||
if ((scheme_str = strtok(v, "$")) == NULL)
|
if ((scheme_str = strsep(&v, "$")) == NULL)
|
||||||
goto invalid_secret;
|
goto invalid_secret;
|
||||||
if ((iterations_str = strtok(NULL, ":")) == NULL)
|
if ((iterations_str = strsep(&v, ":")) == NULL)
|
||||||
goto invalid_secret;
|
goto invalid_secret;
|
||||||
if ((salt_str = strtok(NULL, "$")) == NULL)
|
if ((salt_str = strsep(&v, "$")) == NULL)
|
||||||
goto invalid_secret;
|
goto invalid_secret;
|
||||||
if ((storedkey_str = strtok(NULL, ":")) == NULL)
|
if ((storedkey_str = strsep(&v, ":")) == NULL)
|
||||||
goto invalid_secret;
|
|
||||||
if ((serverkey_str = strtok(NULL, "")) == NULL)
|
|
||||||
goto invalid_secret;
|
goto invalid_secret;
|
||||||
|
serverkey_str = v;
|
||||||
|
|
||||||
/* Parse the fields */
|
/* Parse the fields */
|
||||||
if (strcmp(scheme_str, "SCRAM-SHA-256") != 0)
|
if (strcmp(scheme_str, "SCRAM-SHA-256") != 0)
|
||||||
|
@ -2813,6 +2813,7 @@ icu_set_collation_attributes(UCollator *collator, const char *loc,
|
|||||||
char *icu_locale_id;
|
char *icu_locale_id;
|
||||||
char *lower_str;
|
char *lower_str;
|
||||||
char *str;
|
char *str;
|
||||||
|
char *token;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The input locale may be a BCP 47 language tag, e.g.
|
* 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;
|
return;
|
||||||
str++;
|
str++;
|
||||||
|
|
||||||
for (char *token = strtok(str, ";"); token; token = strtok(NULL, ";"))
|
while ((token = strsep(&str, ";")))
|
||||||
{
|
{
|
||||||
char *e = strchr(token, '=');
|
char *e = strchr(token, '=');
|
||||||
|
|
||||||
|
@ -119,7 +119,9 @@ pg_logging_init(const char *argv0)
|
|||||||
|
|
||||||
if (colors)
|
if (colors)
|
||||||
{
|
{
|
||||||
for (char *token = strtok(colors, ":"); token; token = strtok(NULL, ":"))
|
char *token;
|
||||||
|
|
||||||
|
while ((token = strsep(&colors, ":")))
|
||||||
{
|
{
|
||||||
char *e = strchr(token, '=');
|
char *e = strchr(token, '=');
|
||||||
|
|
||||||
|
@ -234,12 +234,11 @@ static void
|
|||||||
split_to_stringlist(const char *s, const char *delim, _stringlist **listhead)
|
split_to_stringlist(const char *s, const char *delim, _stringlist **listhead)
|
||||||
{
|
{
|
||||||
char *sc = pg_strdup(s);
|
char *sc = pg_strdup(s);
|
||||||
char *token = strtok(sc, delim);
|
char *token;
|
||||||
|
|
||||||
while (token)
|
while ((token = strsep(&sc, delim)))
|
||||||
{
|
{
|
||||||
add_stringlist_item(listhead, token);
|
add_stringlist_item(listhead, token);
|
||||||
token = strtok(NULL, delim);
|
|
||||||
}
|
}
|
||||||
free(sc);
|
free(sc);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user