Ticket #21329: GETINFO onions/current returns empty list

If there are no ephemeral or detached onion services, then
"GETINFO onions/current" or "GETINFO onions/detached" should
return an empty list instead of an error
This commit is contained in:
meejah 2017-01-28 13:49:18 -07:00
parent 67eb6470d7
commit fc58c37e33
4 changed files with 54 additions and 6 deletions

3
changes/bug21329 Normal file
View File

@ -0,0 +1,3 @@
o Minor bugfixes (controller):
- GETINFO onions/current and onions/detached no longer 551 on empty lists
Fixes bug 21329

View File

@ -2824,12 +2824,13 @@ getinfo_helper_events(control_connection_t *control_conn,
/** Implementation helper for GETINFO: knows how to enumerate hidden services
* created via the control port. */
static int
STATIC int
getinfo_helper_onions(control_connection_t *control_conn,
const char *question, char **answer,
const char **errmsg)
{
smartlist_t *onion_list = NULL;
(void) errmsg; /* no errors from this method */
if (control_conn && !strcmp(question, "onions/current")) {
onion_list = control_conn->ephemeral_onion_services;
@ -2839,13 +2840,13 @@ getinfo_helper_onions(control_connection_t *control_conn,
return 0;
}
if (!onion_list || smartlist_len(onion_list) == 0) {
if (errmsg) {
*errmsg = "No onion services of the specified type.";
if (answer) {
*answer = tor_strdup("");
}
return -1;
}
if (answer) {
} else {
if (answer) {
*answer = smartlist_join_strings(onion_list, "\r\n", 0, NULL);
}
}
return 0;

View File

@ -262,6 +262,11 @@ STATIC crypto_pk_t *add_onion_helper_keyarg(const char *arg, int discard_pk,
STATIC rend_authorized_client_t *
add_onion_helper_clientauth(const char *arg, int *created, char **err_msg_out);
STATIC int getinfo_helper_onions(
control_connection_t *control_conn,
const char *question,
char **answer,
const char **errmsg);
STATIC void getinfo_helper_downloads_networkstatus(
const char *flavor,
download_status_t **dl_to_emit,

View File

@ -108,6 +108,44 @@ test_add_onion_helper_keyarg(void *arg)
tor_free(arg_str);
}
static void
test_getinfo_helper_onion(void *arg)
{
(void)arg;
control_connection_t dummy;
/* Get results out */
char *answer = NULL;
const char *errmsg = NULL;
char *service_id = NULL;
int rt = 0;
dummy.ephemeral_onion_services = NULL;
/* successfully get an empty answer */
rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg);
tt_assert(rt == 0);
tt_str_op(answer, OP_EQ, "");
tor_free(answer);
/* successfully get an empty answer */
rt = getinfo_helper_onions(&dummy, "onions/detached", &answer, &errmsg);
tt_assert(rt == 0);
tt_str_op(answer, OP_EQ, "");
tor_free(answer);
/* get an answer for one onion service */
service_id = tor_strdup("dummy_onion_id");
dummy.ephemeral_onion_services = smartlist_new();
smartlist_add(dummy.ephemeral_onion_services, service_id);
rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg);
tt_assert(rt == 0);
tt_str_op(answer, OP_EQ, "dummy_onion_id");
done:
tor_free(answer);
tor_free(service_id);
}
static void
test_rend_service_parse_port_config(void *arg)
{
@ -1332,6 +1370,7 @@ test_download_status_bridge(void *arg)
struct testcase_t controller_tests[] = {
{ "add_onion_helper_keyarg", test_add_onion_helper_keyarg, 0, NULL, NULL },
{ "getinfo_helper_onion", test_getinfo_helper_onion, 0, NULL, NULL },
{ "rend_service_parse_port_config", test_rend_service_parse_port_config, 0,
NULL, NULL },
{ "add_onion_helper_clientauth", test_add_onion_helper_clientauth, 0, NULL,