[tor-commits] [tor/master] nodelist: Add support for multiple addresses in describe.c

asn at torproject.org asn at torproject.org
Tue Aug 27 08:44:42 UTC 2019


commit 23844bc7399a3517af23fe7f6429333b9f66df9e
Author: teor <teor at torproject.org>
Date:   Mon Aug 19 16:35:24 2019 +1000

    nodelist: Add support for multiple addresses in describe.c
    
    Also prepare for unit tests.
    
    Part of 21003.
---
 src/feature/nodelist/describe.c | 58 +++++++++++++++++++++++++----------------
 src/feature/nodelist/describe.h | 30 +++++++++++++++++++++
 2 files changed, 65 insertions(+), 23 deletions(-)

diff --git a/src/feature/nodelist/describe.c b/src/feature/nodelist/describe.c
index 7924d9a7a..b64d4335a 100644
--- a/src/feature/nodelist/describe.c
+++ b/src/feature/nodelist/describe.c
@@ -9,6 +9,8 @@
  * \brief Format short descriptions of relays.
  */
 
+#define DESCRIBE_PRIVATE
+
 #include "core/or/or.h"
 #include "feature/nodelist/describe.h"
 
@@ -16,15 +18,7 @@
 #include "feature/nodelist/node_st.h"
 #include "feature/nodelist/routerinfo_st.h"
 #include "feature/nodelist/routerstatus_st.h"
-
-/**
- * Longest allowed output of format_node_description, plus 1 character for
- * NUL.  This allows space for:
- * "$FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF~xxxxxxxxxxxxxxxxxxx at"
- * " [ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255]"
- * plus a terminating NUL.
- */
-#define NODE_DESC_BUF_LEN (MAX_VERBOSE_NICKNAME_LEN+4+TOR_ADDR_BUF_LEN)
+#include "feature/nodelist/microdesc_st.h"
 
 /** Use <b>buf</b> (which must be at least NODE_DESC_BUF_LEN bytes long) to
  * hold a human-readable description of a node with identity digest
@@ -32,11 +26,12 @@
  * <b>addr</b>.
  *
  * The <b>nickname</b> and <b>addr</b> fields are optional and may be set to
- * NULL.  The <b>addr32h</b> field is optional and may be set to 0.
+ * NULL or the null address.  The <b>addr32h</b> field is optional and may be
+ * set to 0.
  *
- * Return a pointer to the front of <b>buf</b>.
+ * Return a pointer to the front of <b>buf</b>, or a string constant on error.
  */
-static const char *
+STATIC const char *
 format_node_description(char *buf,
                         const char *id_digest,
                         const char *nickname,
@@ -44,6 +39,7 @@ format_node_description(char *buf,
                         uint32_t addr32h)
 {
   char *cp;
+  bool has_addr = addr && !tor_addr_is_null(addr);
 
   if (!buf)
     return "<NULL BUFFER>";
@@ -56,17 +52,24 @@ format_node_description(char *buf,
     strlcpy(buf+1+HEX_DIGEST_LEN+1, nickname, MAX_NICKNAME_LEN+1);
     cp += strlen(cp);
   }
-  if (addr32h || addr) {
+  if (addr32h || has_addr) {
     memcpy(cp, " at ", 4);
     cp += 4;
-    if (addr) {
-      tor_addr_to_str(cp, addr, TOR_ADDR_BUF_LEN, 0);
-    } else {
-      struct in_addr in;
-      in.s_addr = htonl(addr32h);
-      tor_inet_ntoa(&in, cp, INET_NTOA_BUF_LEN);
-    }
   }
+  if (addr32h) {
+    struct in_addr in;
+    in.s_addr = htonl(addr32h);
+    tor_inet_ntoa(&in, cp, INET_NTOA_BUF_LEN);
+    cp += strlen(cp);
+  }
+  if (addr32h && has_addr) {
+    memcpy(cp, " and ", 5);
+    cp += 5;
+  }
+  if (has_addr) {
+    tor_addr_to_str(cp, addr, TOR_ADDR_BUF_LEN, 1);
+  }
+
   return buf;
 }
 
@@ -85,7 +88,7 @@ router_describe(const routerinfo_t *ri)
   return format_node_description(buf,
                                  ri->cache_info.identity_digest,
                                  ri->nickname,
-                                 NULL,
+                                 &ri->ipv6_addr,
                                  ri->addr);
 }
 
@@ -100,6 +103,7 @@ node_describe(const node_t *node)
   static char buf[NODE_DESC_BUF_LEN];
   const char *nickname = NULL;
   uint32_t addr32h = 0;
+  const tor_addr_t *ipv6_addr = NULL;
 
   if (!node)
     return "<null>";
@@ -107,15 +111,23 @@ node_describe(const node_t *node)
   if (node->rs) {
     nickname = node->rs->nickname;
     addr32h = node->rs->addr;
+    ipv6_addr = &node->rs->ipv6_addr;
+    /* Support consensus versions less than 28, when IPv6 addresses were in
+     * microdescs. This code can be removed when 0.2.9 is no longer supported,
+     * and the MIN_METHOD_FOR_NO_A_LINES_IN_MICRODESC macro is removed. */
+    if (node->md && tor_addr_is_null(ipv6_addr)) {
+      ipv6_addr = &node->md->ipv6_addr;
+    }
   } else if (node->ri) {
     nickname = node->ri->nickname;
     addr32h = node->ri->addr;
+    ipv6_addr = &node->ri->ipv6_addr;
   }
 
   return format_node_description(buf,
                                  node->identity,
                                  nickname,
-                                 NULL,
+                                 ipv6_addr,
                                  addr32h);
 }
 
@@ -134,7 +146,7 @@ routerstatus_describe(const routerstatus_t *rs)
   return format_node_description(buf,
                                  rs->identity_digest,
                                  rs->nickname,
-                                 NULL,
+                                 &rs->ipv6_addr,
                                  rs->addr);
 }
 
diff --git a/src/feature/nodelist/describe.h b/src/feature/nodelist/describe.h
index 05f52c47c..6c0d6dc48 100644
--- a/src/feature/nodelist/describe.h
+++ b/src/feature/nodelist/describe.h
@@ -24,4 +24,34 @@ const char *routerstatus_describe(const struct routerstatus_t *ri);
 
 void router_get_verbose_nickname(char *buf, const routerinfo_t *router);
 
+#if defined(DESCRIBE_PRIVATE) || defined(TOR_UNIT_TESTS)
+
+/**
+ * Longest allowed output for an IPv4 address "255.255.255.255", with NO
+ * terminating NUL.
+ */
+#define IPV4_BUF_LEN_NO_NUL 15
+
+/**
+ * Longest allowed output of format_node_description, plus 1 character for
+ * NUL.  This allows space for:
+ * "$FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF~xxxxxxxxxxxxxxxxxxx at"
+ * " 255.255.255.255 and [ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255]"
+ * plus a terminating NUL.
+ */
+#define NODE_DESC_BUF_LEN \
+  (MAX_VERBOSE_NICKNAME_LEN+4+IPV4_BUF_LEN_NO_NUL+5+TOR_ADDR_BUF_LEN)
+
+#endif /* defined(DESCRIBE_PRIVATE) || defined(TOR_UNIT_TESTS) */
+
+#ifdef TOR_UNIT_TESTS
+
+STATIC const char *format_node_description(char *buf,
+                                           const char *id_digest,
+                                           const char *nickname,
+                                           const tor_addr_t *addr,
+                                           uint32_t addr32h);
+
+#endif /* defined(TOR_UNIT_TESTS) */
+
 #endif /* !defined(TOR_DESCRIBE_H) */





More information about the tor-commits mailing list