Merge branch 'bug31408_035' into bug31408_master

This commit is contained in:
teor 2019-09-24 11:07:38 +10:00
commit 876b3e2775
No known key found for this signature in database
GPG Key ID: 10FEAA0E7075672A
3 changed files with 79 additions and 4 deletions

5
changes/bug31408 Normal file
View File

@ -0,0 +1,5 @@
o Major bugfixes (torrc):
- Stop ignoring torrc options after an %include directive, when the
included directory ends with a file that does not contain any config
options. (But does contain comments or whitespace.)
Fixes bug 31408; bugfix on 0.3.1.1-alpha.

View File

@ -153,16 +153,18 @@ config_process_include(const char *path, int recursion_level, int extended,
int rv = -1; int rv = -1;
SMARTLIST_FOREACH_BEGIN(config_files, const char *, config_file) { SMARTLIST_FOREACH_BEGIN(config_files, const char *, config_file) {
config_line_t *included_config = NULL; config_line_t *included_config = NULL;
config_line_t *included_config_last = NULL;
if (config_get_included_config(config_file, recursion_level, extended, if (config_get_included_config(config_file, recursion_level, extended,
&included_config, list_last, &included_config, &included_config_last,
opened_lst) < 0) { opened_lst) < 0) {
goto done; goto done;
} }
*next = included_config; *next = included_config;
if (*list_last) if (included_config_last) {
next = &(*list_last)->next; next = &included_config_last->next;
*list_last = included_config_last;
}
} SMARTLIST_FOREACH_END(config_file); } SMARTLIST_FOREACH_END(config_file);
*list = ret_list; *list = ret_list;
rv = 0; rv = 0;

View File

@ -5325,6 +5325,73 @@ test_config_include_folder_order(void *data)
tor_free(dir); tor_free(dir);
} }
static void
test_config_include_blank_file_last(void *data)
{
(void)data;
config_line_t *result = NULL;
char *torrcd = NULL;
char *path = NULL;
char *dir = tor_strdup(get_fname("test_include_blank_file_last"));
tt_ptr_op(dir, OP_NE, NULL);
#ifdef _WIN32
tt_int_op(mkdir(dir), OP_EQ, 0);
#else
tt_int_op(mkdir(dir, 0700), OP_EQ, 0);
#endif
tor_asprintf(&torrcd, "%s"PATH_SEPARATOR"%s", dir, "torrc.d");
#ifdef _WIN32
tt_int_op(mkdir(torrcd), OP_EQ, 0);
#else
tt_int_op(mkdir(torrcd, 0700), OP_EQ, 0);
#endif
tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "aa_1st");
tt_int_op(write_str_to_file(path, "Test 1\n", 0), OP_EQ, 0);
tor_free(path);
tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "bb_2nd");
tt_int_op(write_str_to_file(path, "Test 2\n", 0), OP_EQ, 0);
tor_free(path);
tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", torrcd, "cc_comment");
tt_int_op(write_str_to_file(path, "# comment only\n", 0), OP_EQ, 0);
tor_free(path);
char torrc_contents[1000];
tor_snprintf(torrc_contents, sizeof(torrc_contents),
"%%include %s\n"
"Test 3\n",
torrcd);
int include_used;
tt_int_op(config_get_lines_include(torrc_contents, &result, 0, &include_used,
NULL), OP_EQ, 0);
tt_ptr_op(result, OP_NE, NULL);
tt_int_op(include_used, OP_EQ, 1);
int len = 0;
config_line_t *next;
for (next = result; next != NULL; next = next->next) {
char expected[10];
tor_snprintf(expected, sizeof(expected), "%d", len + 1);
tt_str_op(next->key, OP_EQ, "Test");
tt_str_op(next->value, OP_EQ, expected);
len++;
}
tt_int_op(len, OP_EQ, 3);
done:
config_free_lines(result);
tor_free(torrcd);
tor_free(path);
tor_free(dir);
}
static void static void
test_config_include_path_syntax(void *data) test_config_include_path_syntax(void *data)
{ {
@ -6045,6 +6112,7 @@ struct testcase_t config_tests[] = {
CONFIG_TEST(include_recursion_before_after, 0), CONFIG_TEST(include_recursion_before_after, 0),
CONFIG_TEST(include_recursion_after_only, 0), CONFIG_TEST(include_recursion_after_only, 0),
CONFIG_TEST(include_folder_order, 0), CONFIG_TEST(include_folder_order, 0),
CONFIG_TEST(include_blank_file_last, 0),
CONFIG_TEST(include_path_syntax, 0), CONFIG_TEST(include_path_syntax, 0),
CONFIG_TEST(include_not_processed, 0), CONFIG_TEST(include_not_processed, 0),
CONFIG_TEST(include_has_include, 0), CONFIG_TEST(include_has_include, 0),