Fix strsep() use for SCRAM secrets parsing
authorPeter Eisentraut <peter@eisentraut.org>
Fri, 18 Oct 2024 09:06:41 +0000 (11:06 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Fri, 18 Oct 2024 09:15:54 +0000 (11:15 +0200)
The previous code (from commit 5d2e1cc117b) did not detect end of
string correctly, so it would fail to error out if fewer than the
expected number of fields were present, which could then later lead to
a crash when NULL string pointers are accessed.

Reported-by: Alexander Lakhin <exclusion@gmail.com>
Reported-by: Ranier Vilela <ranier.vf@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/79692bf9-17d3-41e6-b9c9-fc8c3944222a@eisentraut.org

src/backend/libpq/auth-scram.c

index 03ddddc3c27ab4dfdc45a2c17eb7ece877649648..56df870e9ef2e9a59fa8a436b026a34e0363b437 100644 (file)
@@ -608,13 +608,17 @@ parse_scram_secret(const char *secret, int *iterations,
     * SCRAM-SHA-256$<iterations>:<salt>$<storedkey>:<serverkey>
     */
    v = pstrdup(secret);
-   if ((scheme_str = strsep(&v, "$")) == NULL)
+   scheme_str = strsep(&v, "$");
+   if (v == NULL)
        goto invalid_secret;
-   if ((iterations_str = strsep(&v, ":")) == NULL)
+   iterations_str = strsep(&v, ":");
+   if (v == NULL)
        goto invalid_secret;
-   if ((salt_str = strsep(&v, "$")) == NULL)
+   salt_str = strsep(&v, "$");
+   if (v == NULL)
        goto invalid_secret;
-   if ((storedkey_str = strsep(&v, ":")) == NULL)
+   storedkey_str = strsep(&v, ":");
+   if (v == NULL)
        goto invalid_secret;
    serverkey_str = v;