]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Allow comments for multi-line torrc options
authorSebastian Hahn <sebastian@torproject.org>
Fri, 10 Sep 2010 23:25:48 +0000 (01:25 +0200)
committerSebastian Hahn <sebastian@torproject.org>
Fri, 10 Sep 2010 23:41:23 +0000 (01:41 +0200)
src/common/util.c
src/or/circuitbuild.c
src/or/relay.c
src/test/test_util.c

index 6b9455ddd73502d93dd656f515f611662293bc77..e47ac78d35cc65c43fa59a6fc3ddfc9a91b03756 100644 (file)
@@ -2309,9 +2309,10 @@ parse_config_line_from_str(const char *line, char **key_out, char **value_out)
     return line;
   }
 
-  /* Skip until the next space. */
+  /* Skip until the next space or \ followed by newline. */
   key = line;
-  while (*line && !TOR_ISSPACE(*line) && *line != '#')
+  while (*line && !TOR_ISSPACE(*line) && *line != '#' &&
+         ! (line[0] == '\\' && line[1] == '\n'))
     ++line;
   *key_out = tor_strndup(key, line-key);
 
@@ -2322,7 +2323,7 @@ parse_config_line_from_str(const char *line, char **key_out, char **value_out)
   val = line;
 
   /* Find the end of the line. */
-  if (*line == '\"') {
+  if (*line == '\"') { // XXX No continuation here
     if (!(line = unescape_string(line, value_out, NULL)))
        return NULL;
     while (*line == ' ' || *line == '\t')
@@ -2330,10 +2331,14 @@ parse_config_line_from_str(const char *line, char **key_out, char **value_out)
     if (*line && *line != '#' && *line != '\n')
       return NULL;
   } else {
-    while (*line && *line != '\n' && *line != '#') {
+    while (*line && *line != '\n' && (*line != '#' || continuation)) {
       if (*line == '\\' && line[1] == '\n') {
         continuation = 1;
         ++line;
+      } else if (*line == '#') {
+        do {
+          ++line;
+        } while (*line && *line != '\n');
       }
       ++line;
     }
@@ -2352,7 +2357,12 @@ parse_config_line_from_str(const char *line, char **key_out, char **value_out)
       char *v_out, *v_in;
       v_out = v_in = *value_out;
       while (*v_in) {
-        if (v_in[0] == '\\' && v_in[1] == '\n') {
+        if (*v_in == '#') {
+          do {
+            ++v_in;
+          } while (*v_in && *v_in != '\n');
+          ++v_in;
+        } else if (v_in[0] == '\\' && v_in[1] == '\n') {
           v_in += 2;
         } else {
           *v_out++ = *v_in++;
@@ -2360,7 +2370,6 @@ parse_config_line_from_str(const char *line, char **key_out, char **value_out)
       }
       *v_out = '\0';
     }
-
   }
 
   if (*line == '#') {
index 5567b246ab3385f5f44714944362199004e264a1..ef1bab32061b47fb7a9fd2c0a06051c8003a61a1 100644 (file)
@@ -1752,7 +1752,8 @@ circuit_deliver_create_cell(circuit_t *circ, uint8_t cell_type,
   cell.circ_id = circ->n_circ_id;
 
   memcpy(cell.payload, payload, ONIONSKIN_CHALLENGE_LEN);
-  append_cell_to_circuit_queue(circ, circ->n_conn, &cell, CELL_DIRECTION_OUT, 0);
+  append_cell_to_circuit_queue(circ, circ->n_conn, &cell,
+                               CELL_DIRECTION_OUT, 0);
 
   if (CIRCUIT_IS_ORIGIN(circ)) {
     /* mark it so it gets better rate limiting treatment. */
index 0d51ea4060a3f6e85a975c2993777756aec6d139..0b0b7067a052e25fc42dfc03e89b9946fd0558bc 100644 (file)
@@ -2446,3 +2446,4 @@ circuit_queue_streams_are_blocked(circuit_t *circ)
     return circ->streams_blocked_on_p_conn;
   }
 }
+
index 84bb5a67f4dfd8d254ecc29cee85bffd50506070..49823fde704d0a17f743e7237128c2a35d43f1d3 100644 (file)
@@ -103,6 +103,8 @@ test_util_config_line(void)
           "k9 a line that\\\n spans two lines.\n\n"
           "k10 more than\\\n one contin\\\nuation\n"
           "k11  \\\ncontinuation at the start\n"
+          "k12 line with a\\\n#comment\n embedded\n"
+          "k13\\\ncontinuation at the very start\n"
           , sizeof(buf));
   str = buf;
 
@@ -180,6 +182,16 @@ test_util_config_line(void)
   test_streq(v, "continuation at the start");
   tor_free(k); tor_free(v);
 
+  str = parse_config_line_from_str(str, &k, &v);
+  test_streq(k, "k12");
+  test_streq(v, "line with a embedded");
+  tor_free(k); tor_free(v);
+
+  str = parse_config_line_from_str(str, &k, &v);
+  test_streq(k, "k13");
+  test_streq(v, "continuation at the very start");
+  tor_free(k); tor_free(v);
+
   test_streq(str, "");
 
  done: