1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-21 00:42:43 +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:
Peter Eisentraut
2024-07-22 15:45:46 +02:00
parent 90c1ba52e0
commit 5d2e1cc117
4 changed files with 12 additions and 11 deletions

View File

@@ -608,16 +608,15 @@ parse_scram_secret(const char *secret, int *iterations,
* SCRAM-SHA-256$<iterations>:<salt>$<storedkey>:<serverkey>
*/
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)