mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Merge remote-tracking branch 'teor/bug20484_029_v2' into maint-0.2.9
This commit is contained in:
@@ -73,6 +73,7 @@
|
||||
{print_ = (I64_PRINTF_TYPE) value_;}, {}, TT_EXIT_TEST_FUNCTION)
|
||||
|
||||
const char *get_fname(const char *name);
|
||||
const char *get_fname_rnd(const char *name);
|
||||
struct crypto_pk_t *pk_generate(int idx);
|
||||
|
||||
#define US2_CONCAT_2__(a, b) a ## __ ## b
|
||||
|
||||
+32
-23
@@ -518,6 +518,11 @@ mock_get_options(void)
|
||||
return mock_options;
|
||||
}
|
||||
|
||||
/* arg can't be 0 (the test fails) or 2 (the test is skipped) */
|
||||
#define CREATE_HS_DIR_NONE ((intptr_t)0x04)
|
||||
#define CREATE_HS_DIR1 ((intptr_t)0x08)
|
||||
#define CREATE_HS_DIR2 ((intptr_t)0x10)
|
||||
|
||||
/* Test that single onion poisoning works. */
|
||||
static void
|
||||
test_single_onion_poisoning(void *arg)
|
||||
@@ -528,15 +533,15 @@ test_single_onion_poisoning(void *arg)
|
||||
MOCK(get_options, mock_get_options);
|
||||
|
||||
int ret = -1;
|
||||
mock_options->DataDirectory = tor_strdup(get_fname("test_data_dir"));
|
||||
intptr_t create_dir_mask = (intptr_t)arg;
|
||||
/* Get directories with a random suffix so we can repeat the tests */
|
||||
mock_options->DataDirectory = tor_strdup(get_fname_rnd("test_data_dir"));
|
||||
rend_service_t *service_1 = tor_malloc_zero(sizeof(rend_service_t));
|
||||
char *dir1 = tor_strdup(get_fname("test_hs_dir1"));
|
||||
char *dir1 = tor_strdup(get_fname_rnd("test_hs_dir1"));
|
||||
rend_service_t *service_2 = tor_malloc_zero(sizeof(rend_service_t));
|
||||
char *dir2 = tor_strdup(get_fname("test_hs_dir2"));
|
||||
char *dir2 = tor_strdup(get_fname_rnd("test_hs_dir2"));
|
||||
smartlist_t *services = smartlist_new();
|
||||
|
||||
(void) arg;
|
||||
|
||||
/* No services, no problem! */
|
||||
mock_options->HiddenServiceSingleHopMode = 0;
|
||||
mock_options->HiddenServiceNonAnonymousMode = 0;
|
||||
@@ -549,22 +554,20 @@ test_single_onion_poisoning(void *arg)
|
||||
ret = rend_service_list_verify_single_onion_poison(services, mock_options);
|
||||
tt_assert(ret == 0);
|
||||
|
||||
/* Create directories for both services */
|
||||
|
||||
#ifdef _WIN32
|
||||
ret = mkdir(mock_options->DataDirectory);
|
||||
tt_assert(ret == 0);
|
||||
ret = mkdir(dir1);
|
||||
tt_assert(ret == 0);
|
||||
ret = mkdir(dir2);
|
||||
#else
|
||||
ret = mkdir(mock_options->DataDirectory, 0700);
|
||||
tt_assert(ret == 0);
|
||||
ret = mkdir(dir1, 0700);
|
||||
tt_assert(ret == 0);
|
||||
ret = mkdir(dir2, 0700);
|
||||
#endif
|
||||
/* Create the data directory, and, if the correct bit in arg is set,
|
||||
* create a directory for that service.
|
||||
* The data directory is required for the lockfile, which is used when
|
||||
* loading keys. */
|
||||
ret = check_private_dir(mock_options->DataDirectory, CPD_CREATE, NULL);
|
||||
tt_assert(ret == 0);
|
||||
if (create_dir_mask & CREATE_HS_DIR1) {
|
||||
ret = check_private_dir(dir1, CPD_CREATE, NULL);
|
||||
tt_assert(ret == 0);
|
||||
}
|
||||
if (create_dir_mask & CREATE_HS_DIR2) {
|
||||
ret = check_private_dir(dir2, CPD_CREATE, NULL);
|
||||
tt_assert(ret == 0);
|
||||
}
|
||||
|
||||
service_1->directory = dir1;
|
||||
service_2->directory = dir2;
|
||||
@@ -694,7 +697,7 @@ test_single_onion_poisoning(void *arg)
|
||||
tt_assert(ret < 0);
|
||||
|
||||
done:
|
||||
/* TODO: should we delete the directories here? */
|
||||
/* The test harness deletes the directories at exit */
|
||||
rend_service_free(service_1);
|
||||
rend_service_free(service_2);
|
||||
smartlist_free(services);
|
||||
@@ -716,8 +719,14 @@ struct testcase_t hs_tests[] = {
|
||||
NULL, NULL },
|
||||
{ "hs_auth_cookies", test_hs_auth_cookies, TT_FORK,
|
||||
NULL, NULL },
|
||||
{ "single_onion_poisoning", test_single_onion_poisoning, TT_FORK,
|
||||
NULL, NULL },
|
||||
{ "single_onion_poisoning_create_dir_none", test_single_onion_poisoning,
|
||||
TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR_NONE) },
|
||||
{ "single_onion_poisoning_create_dir1", test_single_onion_poisoning,
|
||||
TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR1) },
|
||||
{ "single_onion_poisoning_create_dir2", test_single_onion_poisoning,
|
||||
TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR2) },
|
||||
{ "single_onion_poisoning_create_dir_both", test_single_onion_poisoning,
|
||||
TT_FORK, &passthrough_setup, (void*)(CREATE_HS_DIR1 | CREATE_HS_DIR2) },
|
||||
END_OF_TESTCASES
|
||||
};
|
||||
|
||||
|
||||
@@ -102,18 +102,41 @@ setup_directory(void)
|
||||
temp_dir_setup_in_pid = getpid();
|
||||
}
|
||||
|
||||
/** Return a filename relative to our testing temporary directory */
|
||||
const char *
|
||||
get_fname(const char *name)
|
||||
/** Return a filename relative to our testing temporary directory, based on
|
||||
* name and suffix. If name is NULL, return the name of the testing temporary
|
||||
* directory. */
|
||||
static const char *
|
||||
get_fname_suffix(const char *name, const char *suffix)
|
||||
{
|
||||
static char buf[1024];
|
||||
setup_directory();
|
||||
if (!name)
|
||||
return temp_dir;
|
||||
tor_snprintf(buf,sizeof(buf),"%s/%s",temp_dir,name);
|
||||
tor_snprintf(buf,sizeof(buf),"%s/%s%s%s",temp_dir,name,suffix ? "_" : "",
|
||||
suffix ? suffix : "");
|
||||
return buf;
|
||||
}
|
||||
|
||||
/** Return a filename relative to our testing temporary directory. If name is
|
||||
* NULL, return the name of the testing temporary directory. */
|
||||
const char *
|
||||
get_fname(const char *name)
|
||||
{
|
||||
return get_fname_suffix(name, NULL);
|
||||
}
|
||||
|
||||
/** Return a filename with a random suffix, relative to our testing temporary
|
||||
* directory. If name is NULL, return the name of the testing temporary
|
||||
* directory, without any suffix. */
|
||||
const char *
|
||||
get_fname_rnd(const char *name)
|
||||
{
|
||||
char rnd[256], rnd32[256];
|
||||
crypto_rand(rnd, RAND_PATH_BYTES);
|
||||
base32_encode(rnd32, sizeof(rnd32), rnd, RAND_PATH_BYTES);
|
||||
return get_fname_suffix(name, rnd32);
|
||||
}
|
||||
|
||||
/* Remove a directory and all of its subdirectories */
|
||||
static void
|
||||
rm_rf(const char *dir)
|
||||
@@ -217,6 +240,9 @@ free_pregenerated_keys(void)
|
||||
static void *
|
||||
passthrough_test_setup(const struct testcase_t *testcase)
|
||||
{
|
||||
/* Make sure the passthrough doesn't unintentionally fail or skip tests */
|
||||
tor_assert(testcase->setup_data);
|
||||
tor_assert(testcase->setup_data != (void*)TT_SKIP);
|
||||
return testcase->setup_data;
|
||||
}
|
||||
static int
|
||||
|
||||
Reference in New Issue
Block a user