[tor-commits] [tor/master] Ticket #21329: GETINFO onions/current returns empty list

nickm at torproject.org nickm at torproject.org
Thu Feb 16 14:48:45 UTC 2017


commit fc58c37e334fec71a204b7b0787d347b647618b8
Author: meejah <meejah at meejah.ca>
Date:   Sat Jan 28 13:49:18 2017 -0700

    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
---
 changes/bug21329           |  3 +++
 src/or/control.c           | 13 +++++++------
 src/or/control.h           |  5 +++++
 src/test/test_controller.c | 39 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 54 insertions(+), 6 deletions(-)

diff --git a/changes/bug21329 b/changes/bug21329
new file mode 100644
index 0000000..60b9363
--- /dev/null
+++ b/changes/bug21329
@@ -0,0 +1,3 @@
+  o Minor bugfixes (controller):
+    - GETINFO onions/current and onions/detached no longer 551 on empty lists
+      Fixes bug 21329
diff --git a/src/or/control.c b/src/or/control.c
index 857b732..cc46cb1 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -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;
diff --git a/src/or/control.h b/src/or/control.h
index 6330c85..16ba1ed 100644
--- a/src/or/control.h
+++ b/src/or/control.h
@@ -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,
diff --git a/src/test/test_controller.c b/src/test/test_controller.c
index d9c0a1e..fc63d83 100644
--- a/src/test/test_controller.c
+++ b/src/test/test_controller.c
@@ -109,6 +109,44 @@ test_add_onion_helper_keyarg(void *arg)
 }
 
 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)
 {
   const char *sep = ",";
@@ -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,





More information about the tor-commits mailing list