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.)
This commit is contained in:
paolo.ingls@gmail.com 2016-09-26 23:25:16 +02:00 committed by Nick Mathewson
parent 3328658728
commit ab78a4df93
3 changed files with 37 additions and 0 deletions

4
changes/bug19167 Normal file
View File

@ -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".

View File

@ -3079,6 +3079,8 @@ parse_config_line_from_str_verbose(const char *line, char **key_out,
} }
while (*line == ' ' || *line == '\t') while (*line == ' ' || *line == '\t')
++line; ++line;
if (*line == '\r' && *(++line) == '\n')
++line;
if (*line && *line != '#' && *line != '\n') { if (*line && *line != '#' && *line != '\n') {
if (err_out) if (err_out)
*err_out = "Excess data after quoted string"; *err_out = "Excess data after quoted string";

View File

@ -1642,6 +1642,36 @@ test_util_config_line_escaped_content(void *arg)
tor_free(v); 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 #ifndef _WIN32
static void static void
test_util_expand_filename(void *arg) test_util_expand_filename(void *arg)
@ -5609,6 +5639,7 @@ struct testcase_t util_tests[] = {
UTIL_LEGACY(config_line_quotes), UTIL_LEGACY(config_line_quotes),
UTIL_LEGACY(config_line_comment_character), UTIL_LEGACY(config_line_comment_character),
UTIL_LEGACY(config_line_escaped_content), UTIL_LEGACY(config_line_escaped_content),
UTIL_LEGACY(config_line_crlf),
UTIL_LEGACY_NO_WIN(expand_filename), UTIL_LEGACY_NO_WIN(expand_filename),
UTIL_LEGACY(escape_string_socks), UTIL_LEGACY(escape_string_socks),
UTIL_LEGACY(string_is_key_value), UTIL_LEGACY(string_is_key_value),