summaryrefslogtreecommitdiff
path: root/src/common/compat.c
diff options
context:
space:
mode:
authornils <nils@shkoo.com>2012-03-30 11:01:21 -0400
committerNick Mathewson <nickm@torproject.org>2012-03-30 11:01:21 -0400
commitefb8a09f41fcd4c48bffdc98ae8d5e0002a0bb88 (patch)
treef3dd0f729bf2c6bf372a2c21252b57ab16fcdc49 /src/common/compat.c
parent56e0959d2ab9cae45d39c5b9d72b1bb1b8ad03b7 (diff)
downloadtor-efb8a09f41fcd4c48bffdc98ae8d5e0002a0bb88.tar.gz
tor-efb8a09f41fcd4c48bffdc98ae8d5e0002a0bb88.zip
Fix tor_strtok_r_impl and test cases per bug #5091
== Nick here. I tweaked this patch a little to make it apply cleanly to master, to extract some common code into a function, and to replace snprintf with tor_snprintf. -- nickm
Diffstat (limited to 'src/common/compat.c')
-rw-r--r--src/common/compat.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/common/compat.c b/src/common/compat.c
index 30bde3d1ca..bd6822517d 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -546,25 +546,43 @@ const char TOR_TOLOWER_TABLE[256] = {
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
};
+/** Helper for tor_strtok_r_impl: Advances cp past all characters in
+ * <b>sep</b>, and returns its new value. */
+static char *
+strtok_helper(char *cp, const char *sep)
+{
+ if (sep[1]) {
+ while (*cp && strchr(sep, *cp))
+ ++cp;
+ } else {
+ while (*cp && *cp == *sep)
+ ++cp;
+ }
+ return cp;
+}
+
/** Implementation of strtok_r for platforms whose coders haven't figured out
* how to write one. Hey guys! You can use this code here for free! */
char *
tor_strtok_r_impl(char *str, const char *sep, char **lasts)
{
char *cp, *start;
- if (str)
+ tor_assert(*sep);
+ if (str) {
+ str = strtok_helper(str, sep);
+ if (!*str)
+ return NULL;
start = cp = *lasts = str;
- else if (!*lasts)
+ } else if (!*lasts || !**lasts) {
return NULL;
- else
+ } else {
start = cp = *lasts;
+ }
- tor_assert(*sep);
if (sep[1]) {
while (*cp && !strchr(sep, *cp))
++cp;
} else {
- tor_assert(strlen(sep) == 1);
cp = strchr(cp, *sep);
}
@@ -572,7 +590,7 @@ tor_strtok_r_impl(char *str, const char *sep, char **lasts)
*lasts = NULL;
} else {
*cp++ = '\0';
- *lasts = cp;
+ *lasts = strtok_helper(cp, sep);
}
return start;
}