summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2012-06-26 11:03:32 -0400
committerNick Mathewson <nickm@torproject.org>2012-06-26 11:03:32 -0400
commit05dd0a9cd9055f0d7cc847ea0c9b5181b9c20057 (patch)
treef2ef8c169882b23932c67afc8684e0006b2c283b
parent4050800251c77d4fc059c51a268abe02c3d4e9a0 (diff)
parent5fad3dc36b3aad7f2ea13e56d838c3eb37fb029d (diff)
downloadtor-05dd0a9cd9055f0d7cc847ea0c9b5181b9c20057.tar.gz
tor-05dd0a9cd9055f0d7cc847ea0c9b5181b9c20057.zip
Merge remote-tracking branch 'origin/maint-0.2.3'
-rw-r--r--changes/clang_strcspn3
-rw-r--r--changes/envvar_test2
-rw-r--r--src/common/util.c21
-rw-r--r--src/test/test_util.c34
4 files changed, 56 insertions, 4 deletions
diff --git a/changes/clang_strcspn b/changes/clang_strcspn
new file mode 100644
index 0000000000..38670ac376
--- /dev/null
+++ b/changes/clang_strcspn
@@ -0,0 +1,3 @@
+ o Minor bugfixes:
+ - Avoid a warning caused by using strcspn from glibc with clang 3.0.
+ Bugfix on 0.2.3.13-alpha.
diff --git a/changes/envvar_test b/changes/envvar_test
new file mode 100644
index 0000000000..d76a817078
--- /dev/null
+++ b/changes/envvar_test
@@ -0,0 +1,2 @@
+ o New unit tests:
+ - Add a unit test for the environment_variable_names_equal function. \ No newline at end of file
diff --git a/src/common/util.c b/src/common/util.c
index 008e26a20c..d63aceabee 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -3357,7 +3357,7 @@ format_helper_exit_status(unsigned char child_state, int saved_errno,
*cur++ = '\n';
*cur++ = '\0';
- res = cur - hex_errno - 1;
+ res = (int)(cur - hex_errno - 1);
goto done;
@@ -3897,13 +3897,26 @@ tor_get_exit_code(const process_handle_t *process_handle,
return PROCESS_EXIT_EXITED;
}
+/** Helper: return the number of characters in <b>s</b> preceding the first
+ * occurence of <b>ch</b>. If <b>ch</b> does not occur in <b>s</b>, return
+ * the length of <b>s</b>. Should be equivalent to strspn(s, "ch"). */
+static INLINE size_t
+str_num_before(const char *s, char ch)
+{
+ const char *cp = strchr(s, ch);
+ if (cp)
+ return cp - s;
+ else
+ return strlen(s);
+}
+
/** Return non-zero iff getenv would consider <b>s1</b> and <b>s2</b>
* to have the same name as strings in a process's environment. */
int
environment_variable_names_equal(const char *s1, const char *s2)
{
- size_t s1_name_len = strcspn(s1, "=");
- size_t s2_name_len = strcspn(s2, "=");
+ size_t s1_name_len = str_num_before(s1, '=');
+ size_t s2_name_len = str_num_before(s2, '=');
return (s1_name_len == s2_name_len &&
tor_memeq(s1, s2, s1_name_len));
@@ -3978,7 +3991,7 @@ process_environment_make(struct smartlist_t *env_vars)
for (i = 0; i < n_env_vars; ++i) {
const char *s = smartlist_get(env_vars_sorted, i);
size_t slen = strlen(s);
- size_t s_name_len = strcspn(s, "=");
+ size_t s_name_len = str_num_before(s, '=');
if (s_name_len == slen) {
log_warn(LD_GENERAL,
diff --git a/src/test/test_util.c b/src/test/test_util.c
index fab95953bd..d2d0a55520 100644
--- a/src/test/test_util.c
+++ b/src/test/test_util.c
@@ -2869,6 +2869,39 @@ test_util_sl_new_from_text_lines(void *ptr)
}
}
+static void
+test_util_envnames(void *ptr)
+{
+ (void) ptr;
+
+ tt_assert(environment_variable_names_equal("abc", "abc"));
+ tt_assert(environment_variable_names_equal("abc", "abc="));
+ tt_assert(environment_variable_names_equal("abc", "abc=def"));
+ tt_assert(environment_variable_names_equal("abc=def", "abc"));
+ tt_assert(environment_variable_names_equal("abc=def", "abc=ghi"));
+
+ tt_assert(environment_variable_names_equal("abc", "abc"));
+ tt_assert(environment_variable_names_equal("abc", "abc="));
+ tt_assert(environment_variable_names_equal("abc", "abc=def"));
+ tt_assert(environment_variable_names_equal("abc=def", "abc"));
+ tt_assert(environment_variable_names_equal("abc=def", "abc=ghi"));
+
+ tt_assert(!environment_variable_names_equal("abc", "abcd"));
+ tt_assert(!environment_variable_names_equal("abc=", "abcd"));
+ tt_assert(!environment_variable_names_equal("abc=", "abcd"));
+ tt_assert(!environment_variable_names_equal("abc=", "def"));
+ tt_assert(!environment_variable_names_equal("abc=", "def="));
+ tt_assert(!environment_variable_names_equal("abc=x", "def=x"));
+
+ tt_assert(!environment_variable_names_equal("", "a=def"));
+ /* A bit surprising. */
+ tt_assert(environment_variable_names_equal("", "=def"));
+ tt_assert(environment_variable_names_equal("=y", "=x"));
+
+ done:
+ ;
+}
+
/** Test process_environment_make */
static void
test_util_make_environment(void *ptr)
@@ -3081,6 +3114,7 @@ struct testcase_t util_tests[] = {
UTIL_TEST(n_bits_set, 0),
UTIL_TEST(eat_whitespace, 0),
UTIL_TEST(sl_new_from_text_lines, 0),
+ UTIL_TEST(envnames, 0),
UTIL_TEST(make_environment, 0),
UTIL_TEST(set_env_var_in_sl, 0),
END_OF_TESTCASES