commit b72d44bd6010657d49646ff10ffc3dc6f7740ae6
parent 7247592dd7ce3542a26a72897c9b6e6021f0241a
Author: Christian Grothoff <christian@grothoff.org>
Date: Fri, 9 Oct 2026 22:43:58 +0200
strtok_r is needed due to nesting, and anyway safer
Diffstat:
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/src/backend/taler-merchant-httpd_auth.c b/src/backend/taler-merchant-httpd_auth.c
@@ -476,8 +476,10 @@ permission_in_scope (const char *permission_required,
}
permissions = GNUNET_strdup (perms_tmp);
{
- const char *perm = strtok (permissions,
- ",");
+ char *sp;
+ const char *perm = strtok_r (permissions,
+ ",",
+ &sp);
if (NULL == perm)
{
@@ -514,14 +516,15 @@ permission_in_scope (const char *permission_required,
GNUNET_free (permissions);
return true;
}
- perm = strtok (NULL,
- ",");
+ perm = strtok_r (NULL,
+ ",",
+ &sp);
}
}
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Permission check failed: %s not found in %s\n",
permission_required,
- permissions);
+ perms_tmp);
GNUNET_free (permissions);
return false;
}
@@ -552,10 +555,14 @@ TMH_scope_is_subset (enum TMH_AuthScope as,
return true;
permissions = GNUNET_strdup (candidate_perms);
{
+ char *sp;
const char *perm;
- perm = strtok (permissions,
- ",");
+ /* permission_in_scope() tokenizes as well, so we must not
+ use the non-reentrant strtok() here. */
+ perm = strtok_r (permissions,
+ ",",
+ &sp);
if (NULL == perm)
{
GNUNET_free (permissions);
@@ -569,8 +576,9 @@ TMH_scope_is_subset (enum TMH_AuthScope as,
GNUNET_free (permissions);
return false;
}
- perm = strtok (NULL,
- ",");
+ perm = strtok_r (NULL,
+ ",",
+ &sp);
}
}
GNUNET_free (permissions);