[tor-commits] [tor/master] torrc parsing b0rks on carriage-return

nickm at torproject.org nickm at torproject.org
Tue Oct 11 13:26:34 UTC 2016


commit ab78a4df93d1aed26cb13343cdd012c8309a206f
Author: paolo.ingls at gmail.com <paolo.ingls at gmail.com>
Date:   Mon Sep 26 23:25:16 2016 +0200

    torrc parsing b0rks on carriage-return
    
    (Specifically, carriage return after a quoted value in a config
    line. Fixes bug 19167; bugfix on 0.2.0.16-alpha when we introduced
    support for quoted values. Unit tests, changes file, and this
    parenthetical by nickm.)
---
 changes/bug19167     |  4 ++++
 src/common/util.c    |  2 ++
 src/test/test_util.c | 31 +++++++++++++++++++++++++++++++
 3 files changed, 37 insertions(+)

diff --git a/changes/bug19167 b/changes/bug19167
new file mode 100644
index 0000000..4a6c22d
--- /dev/null
+++ b/changes/bug19167
@@ -0,0 +1,4 @@
+  o Minor bugfixes (configuration):
+    - When parsing quoted configuration values from the torrc file,
+      handle windows line endings correctly. Fixes bug 19167; bugfix on
+      0.2.0.16-alpha.  Patch from "Pingl".
diff --git a/src/common/util.c b/src/common/util.c
index 259ff87..d1c87d3 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -3079,6 +3079,8 @@ parse_config_line_from_str_verbose(const char *line, char **key_out,
     }
     while (*line == ' ' || *line == '\t')
       ++line;
+    if (*line == '\r' && *(++line) == '\n')
+      ++line;
     if (*line && *line != '#' && *line != '\n') {
       if (err_out)
         *err_out = "Excess data after quoted string";
diff --git a/src/test/test_util.c b/src/test/test_util.c
index d2152dd..8d5dce3 100644
--- a/src/test/test_util.c
+++ b/src/test/test_util.c
@@ -1642,6 +1642,36 @@ test_util_config_line_escaped_content(void *arg)
   tor_free(v);
 }
 
+static void
+test_util_config_line_crlf(void *arg)
+{
+  char *k=NULL, *v=NULL;
+  const char *err = NULL;
+  (void)arg;
+  const char *str =
+    "Hello world\r\n"
+    "Hello \"nice big world\"\r\n";
+
+  str = parse_config_line_from_str_verbose(str, &k, &v, &err);
+  tt_assert(str);
+  tt_str_op(k,OP_EQ,"Hello");
+  tt_str_op(v,OP_EQ,"world");
+  tt_assert(!err);
+  tor_free(k); tor_free(v);
+
+  str = parse_config_line_from_str_verbose(str, &k, &v, &err);
+  tt_assert(str);
+  tt_str_op(k,OP_EQ,"Hello");
+  tt_str_op(v,OP_EQ,"nice big world");
+  tt_assert(!err);
+  tor_free(k); tor_free(v);
+  tt_str_op(str,OP_EQ, "");
+
+ done:
+  tor_free(k); tor_free(v);
+}
+
+
 #ifndef _WIN32
 static void
 test_util_expand_filename(void *arg)
@@ -5609,6 +5639,7 @@ struct testcase_t util_tests[] = {
   UTIL_LEGACY(config_line_quotes),
   UTIL_LEGACY(config_line_comment_character),
   UTIL_LEGACY(config_line_escaped_content),
+  UTIL_LEGACY(config_line_crlf),
   UTIL_LEGACY_NO_WIN(expand_filename),
   UTIL_LEGACY(escape_string_socks),
   UTIL_LEGACY(string_is_key_value),



More information about the tor-commits mailing list