diff --git a/src/or/router.c b/src/or/router.c
index a11d3a5923..0bd4c55026 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -2223,8 +2223,7 @@ is_legal_hexdigest(const char *s)
* and address addr or addr32h.
*
* The nickname and addr fields are optional and may be set to
- * NULL. The addr32h field is optional and may be set to
- * addr32h.
+ * NULL. The addr32h field is optional and may be set to 0.
*
* Return a pointer to the front of buf.
*/
@@ -2237,6 +2236,10 @@ format_node_description(char *buf,
uint32_t addr32h)
{
char *cp;
+
+ if (!buf)
+ return "";
+
buf[0] = '$';
base16_encode(buf+1, HEX_DIGEST_LEN+1, id_digest, DIGEST_LEN);
cp = buf+1+HEX_DIGEST_LEN;
@@ -2268,6 +2271,8 @@ format_node_description(char *buf,
const char *
router_get_description(char *buf, const routerinfo_t *ri)
{
+ if (!ri)
+ return "";
return format_node_description(buf,
ri->cache_info.identity_digest,
ri->is_named,
@@ -2284,6 +2289,8 @@ router_get_description(char *buf, const routerinfo_t *ri)
const char *
routerstatus_get_description(char *buf, const routerstatus_t *rs)
{
+ if (!rs)
+ return "";
return format_node_description(buf,
rs->identity_digest,
rs->is_named,
@@ -2300,6 +2307,8 @@ routerstatus_get_description(char *buf, const routerstatus_t *rs)
const char *
extend_info_get_description(char *buf, const extend_info_t *ei)
{
+ if (!ei)
+ return "";
return format_node_description(buf,
ei->identity_digest,
0,
diff --git a/src/or/router.h b/src/or/router.h
index 6cabfd56e8..a285a3e773 100644
--- a/src/or/router.h
+++ b/src/or/router.h
@@ -86,6 +86,13 @@ int is_legal_nickname(const char *s);
int is_legal_nickname_or_hexdigest(const char *s);
int is_legal_hexdigest(const char *s);
+/**
+ * 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)
const char *format_node_description(char *buf,
const char *id_digest,