[tor-commits] [tor/master] Merge remote branch 'origin/maint-0.2.2'

nickm at torproject.org nickm at torproject.org
Tue Feb 22 19:10:27 UTC 2011


commit b7f201f74606aff1f77551449bebe8783a59733a
Merge: 46b0746 cdc59c1
Author: Nick Mathewson <nickm at torproject.org>
Date:   Tue Feb 22 14:10:42 2011 -0500

    Merge remote branch 'origin/maint-0.2.2'
    
    Conflicts:
    	src/or/policies.c
    	src/or/policies.h

 changes/bug2366   |    8 ++++++++
 src/or/policies.c |    8 ++++++++
 src/or/policies.h |    1 +
 src/or/router.c   |   15 +++++++++------
 4 files changed, 26 insertions(+), 6 deletions(-)

diff --combined src/or/policies.c
index d0406d3,38c2f7c..2cf9982
--- a/src/or/policies.c
+++ b/src/or/policies.c
@@@ -11,7 -11,6 +11,7 @@@
  #include "or.h"
  #include "config.h"
  #include "dirserv.h"
 +#include "nodelist.h"
  #include "policies.h"
  #include "routerparse.h"
  #include "ht.h"
@@@ -262,7 -261,7 +262,7 @@@ fascist_firewall_allows_address_or(cons
  /** Return true iff we think our firewall will let us make an OR connection to
   * <b>ri</b>. */
  int
 -fascist_firewall_allows_or(routerinfo_t *ri)
 +fascist_firewall_allows_or(const routerinfo_t *ri)
  {
    /* XXXX proposal 118 */
    tor_addr_t addr;
@@@ -270,22 -269,6 +270,22 @@@
    return fascist_firewall_allows_address_or(&addr, ri->or_port);
  }
  
 +/** Return true iff we think our firewall will let us make an OR connection to
 + * <b>node</b>. */
 +int
 +fascist_firewall_allows_node(const node_t *node)
 +{
 +  if (node->ri) {
 +    return fascist_firewall_allows_or(node->ri);
 +  } else if (node->rs) {
 +    tor_addr_t addr;
 +    tor_addr_from_ipv4h(&addr, node->rs->addr);
 +    return fascist_firewall_allows_address_or(&addr, node->rs->or_port);
 +  } else {
 +    return 1;
 +  }
 +}
 +
  /** Return true iff we think our firewall will let us make a directory
   * connection to addr:port. */
  int
@@@ -875,11 -858,23 +875,19 @@@ policies_parse_exit_policy(config_line_
    return 0;
  }
  
+ /** Add "reject *:*" to the end of the policy in *<b>dest</b>, allocating
+  * *<b>dest</b> as needed. */
+ void
+ policies_exit_policy_append_reject_star(smartlist_t **dest)
+ {
+   append_exit_policy_string(dest, "reject *:*");
+ }
+ 
 -/** Replace the exit policy of <b>r</b> with reject *:*. */
 +/** Replace the exit policy of <b>node</b> with reject *:* */
  void
 -policies_set_router_exitpolicy_to_reject_all(routerinfo_t *r)
 +policies_set_node_exitpolicy_to_reject_all(node_t *node)
  {
 -  addr_policy_t *item;
 -  addr_policy_list_free(r->exit_policy);
 -  r->exit_policy = smartlist_create();
 -  item = router_parse_addr_policy_item_from_string("reject *:*", -1);
 -  smartlist_add(r->exit_policy, item);
 +  node->rejects_all = 1;
  }
  
  /** Return 1 if there is at least one /8 subnet in <b>policy</b> that
@@@ -1088,7 -1083,7 +1096,7 @@@ policy_summary_split(smartlist_t *summa
    int start_at_index;
  
    int i = 0;
 -  /* XXXX Do a binary search if run time matters */
 +
    while (AT(i)->prt_max < prt_min)
      i++;
    if (AT(i)->prt_min != prt_min) {
@@@ -1301,195 -1296,6 +1309,195 @@@ policy_summarize(smartlist_t *policy
    return result;
  }
  
 +/** Convert a summarized policy string into a short_policy_t.  Return NULL
 + * if the string is not well-formed. */
 +short_policy_t *
 +parse_short_policy(const char *summary)
 +{
 +  const char *orig_summary = summary;
 +  short_policy_t *result;
 +  int is_accept;
 +  int n_entries;
 +  short_policy_entry_t entries[MAX_EXITPOLICY_SUMMARY_LEN]; /* overkill */
 +  const char *next;
 +
 +  if (!strcmpstart(summary, "accept ")) {
 +    is_accept = 1;
 +    summary += strlen("accept ");
 +  } else if (!strcmpstart(summary, "reject ")) {
 +    is_accept = 0;
 +    summary += strlen("reject ");
 +  } else {
 +    log_fn(LOG_PROTOCOL_WARN, LD_DIR, "Unrecognized policy summary keyword");
 +    return NULL;
 +  }
 +
 +  n_entries = 0;
 +  for ( ; *summary; summary = next) {
 +    const char *comma = strchr(summary, ',');
 +    unsigned low, high;
 +    char dummy;
 +    char ent_buf[32];
 +
 +    next = comma ? comma+1 : strchr(summary, '\0');
 +
 +    if (n_entries == MAX_EXITPOLICY_SUMMARY_LEN) {
 +      log_fn(LOG_PROTOCOL_WARN, LD_DIR, "Impossibly long policy summary %s",
 +             escaped(orig_summary));
 +      return NULL;
 +    }
 +
 +    if (! TOR_ISDIGIT(*summary) || next-summary > (int)(sizeof(ent_buf)-1)) {
 +      /* unrecognized entry format. skip it. */
 +      continue;
 +    }
 +    if (next-summary < 2) {
 +      /* empty; skip it. */
 +      continue;
 +    }
 +
 +    memcpy(ent_buf, summary, next-summary-1);
 +    ent_buf[next-summary-1] = '\0';
 +
 +    if (tor_sscanf(ent_buf, "%u-%u%c", &low, &high, &dummy) == 2) {
 +      if (low<1 || low>65535 || high<1 || high>65535) {
 +        log_fn(LOG_PROTOCOL_WARN, LD_DIR,
 +               "Found bad entry in policy summary %s", escaped(orig_summary));
 +        return NULL;
 +      }
 +    } else if (tor_sscanf(ent_buf, "%u%c", &low, &dummy) == 1) {
 +      if (low<1 || low>65535) {
 +        log_fn(LOG_PROTOCOL_WARN, LD_DIR,
 +               "Found bad entry in policy summary %s", escaped(orig_summary));
 +        return NULL;
 +      }
 +      high = low;
 +    } else {
 +      log_fn(LOG_PROTOCOL_WARN, LD_DIR,"Found bad entry in policy summary %s",
 +             escaped(orig_summary));
 +      return NULL;
 +    }
 +
 +    entries[n_entries].min_port = low;
 +    entries[n_entries].max_port = high;
 +    n_entries++;
 +  }
 +
 +  if (n_entries == 0) {
 +    log_fn(LOG_PROTOCOL_WARN, LD_DIR,
 +           "Found no port-range entries in summary %s", escaped(orig_summary));
 +    return NULL;
 +  }
 +
 +  {
 +    size_t size = STRUCT_OFFSET(short_policy_t, entries) +
 +      sizeof(short_policy_entry_t)*(n_entries);
 +    result = tor_malloc_zero(size);
 +
 +    tor_assert( (char*)&result->entries[n_entries-1] < ((char*)result)+size);
 +  }
 +
 +  result->is_accept = is_accept;
 +  result->n_entries = n_entries;
 +  memcpy(result->entries, entries, sizeof(short_policy_entry_t)*n_entries);
 +  return result;
 +}
 +
 +/** Release all storage held in <b>policy</b>. */
 +void
 +short_policy_free(short_policy_t *policy)
 +{
 +  tor_free(policy);
 +}
 +
 +/** See whether the <b>addr</b>:<b>port</b> address is likely to be accepted
 + * or rejected by the summarized policy <b>policy</b>.  Return values are as
 + * for compare_tor_addr_to_addr_policy.  Unlike the regular addr_policy
 + * functions, requires the <b>port</b> be specified. */
 +addr_policy_result_t
 +compare_tor_addr_to_short_policy(const tor_addr_t *addr, uint16_t port,
 +                                 const short_policy_t *policy)
 +{
 +  int i;
 +  int found_match = 0;
 +  int accept;
 +  (void)addr;
 +
 +  tor_assert(port != 0);
 +
 +  if (addr && (tor_addr_is_internal(addr, 0) ||
 +               tor_addr_is_null(addr) ||
 +               tor_addr_is_loopback(addr)))
 +    return ADDR_POLICY_REJECTED;
 +
 +  for (i=0; i < policy->n_entries; ++i) {
 +    const short_policy_entry_t *e = &policy->entries[i];
 +    if (e->min_port <= port && port <= e->max_port) {
 +      found_match = 1;
 +      break;
 +    }
 +  }
 +
 +  if (found_match)
 +    accept = policy->is_accept;
 +  else
 +    accept = ! policy->is_accept;
 +
 +  /* ???? are these right? */
 +  if (accept)
 +    return ADDR_POLICY_PROBABLY_ACCEPTED;
 +  else
 +    return ADDR_POLICY_REJECTED;
 +}
 +
 +/** Return true iff <b>policy</b> seems reject all ports */
 +int
 +short_policy_is_reject_star(const short_policy_t *policy)
 +{
 +  /* This doesn't need to be as much on the lookout as policy_is_reject_star,
 +   * since policy summaries are from the consensus or from consensus
 +   * microdescs.
 +   */
 +  tor_assert(policy);
 +  /* Check for an exact match of "reject 1-65535". */
 +  return (policy->is_accept == 0 && policy->n_entries == 1 &&
 +          policy->entries[0].min_port == 1 &&
 +          policy->entries[0].max_port == 65535);
 +}
 +
 +/** Decides whether addr:port is probably or definitely accepted or rejcted by
 + * <b>node</b>.  See compare_tor_addr_to_addr_policy for details on addr/port
 + * interpretation. */
 +addr_policy_result_t
 +compare_addr_to_node_policy(uint32_t addr, uint16_t port, const node_t *node)
 +{
 +  tor_addr_t a;
 +  tor_addr_from_ipv4h(&a, addr);
 +  return compare_tor_addr_to_node_policy(&a, port, node);
 +}
 +
 +/** Decides whether addr:port is probably or definitely accepted or rejcted by
 + * <b>node</b>.  See compare_tor_addr_to_addr_policy for details on addr/port
 + * interpretation. */
 +addr_policy_result_t
 +compare_tor_addr_to_node_policy(const tor_addr_t *addr, uint16_t port,
 +                                const node_t *node)
 +{
 +  if (node->rejects_all)
 +    return ADDR_POLICY_REJECTED;
 +
 +  if (node->ri)
 +    return compare_tor_addr_to_addr_policy(addr, port, node->ri->exit_policy);
 +  else if (node->md && node->md) {
 +    if (node->md->exit_policy == NULL)
 +      return ADDR_POLICY_REJECTED;
 +    else
 +      return compare_tor_addr_to_short_policy(addr, port,
 +                                              node->md->exit_policy);
 +  } else
 +    return ADDR_POLICY_PROBABLY_REJECTED;
 +}
 +
  /** Implementation for GETINFO control command: knows the answer for questions
   * about "exit-policy/..." */
  int
diff --combined src/or/policies.h
index 371123c,b2947c6..ee1162c
--- a/src/or/policies.h
+++ b/src/or/policies.h
@@@ -19,8 -19,7 +19,8 @@@
  
  int firewall_is_fascist_or(void);
  int fascist_firewall_allows_address_or(const tor_addr_t *addr, uint16_t port);
 -int fascist_firewall_allows_or(routerinfo_t *ri);
 +int fascist_firewall_allows_or(const routerinfo_t *ri);
 +int fascist_firewall_allows_node(const node_t *node);
  int fascist_firewall_allows_address_dir(const tor_addr_t *addr, uint16_t port);
  int dir_policy_permits_address(const tor_addr_t *addr);
  int socks_policy_permits_address(const tor_addr_t *addr);
@@@ -39,16 -38,11 +39,17 @@@ addr_policy_result_t compare_tor_addr_t
                                uint16_t port, const smartlist_t *policy);
  addr_policy_result_t compare_addr_to_addr_policy(uint32_t addr,
                                uint16_t port, const smartlist_t *policy);
 +
 +addr_policy_result_t compare_addr_to_node_policy(uint32_t addr,
 +                              uint16_t port, const node_t *node);
 +addr_policy_result_t compare_tor_addr_to_node_policy(const tor_addr_t *addr,
 +                              uint16_t port, const node_t *node);
 +
  int policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest,
                                 int rejectprivate, const char *local_address,
                                 int add_default_policy);
+ void policies_exit_policy_append_reject_star(smartlist_t **dest);
 -void policies_set_router_exitpolicy_to_reject_all(routerinfo_t *exitrouter);
 +void policies_set_node_exitpolicy_to_reject_all(node_t *exitrouter);
  int exit_policy_is_general_exit(smartlist_t *policy);
  int policy_is_reject_star(const smartlist_t *policy);
  int getinfo_helper_policies(control_connection_t *conn,
@@@ -63,12 -57,5 +64,12 @@@ void policies_free_all(void)
  
  char *policy_summarize(smartlist_t *policy);
  
 +short_policy_t *parse_short_policy(const char *summary);
 +void short_policy_free(short_policy_t *policy);
 +int short_policy_is_reject_star(const short_policy_t *policy);
 +addr_policy_result_t compare_tor_addr_to_short_policy(
 +                          const tor_addr_t *addr, uint16_t port,
 +                          const short_policy_t *policy);
 +
  #endif
  
diff --combined src/or/router.c
index ed998e4,4c5eb7a..3f1a0a0
--- a/src/or/router.c
+++ b/src/or/router.c
@@@ -7,7 -7,6 +7,7 @@@
  #define ROUTER_PRIVATE
  
  #include "or.h"
 +#include "circuitbuild.h"
  #include "circuitlist.h"
  #include "circuituse.h"
  #include "config.h"
@@@ -20,7 -19,6 +20,7 @@@
  #include "hibernate.h"
  #include "main.h"
  #include "networkstatus.h"
 +#include "nodelist.h"
  #include "policies.h"
  #include "relay.h"
  #include "rephist.h"
@@@ -152,8 -150,8 +152,8 @@@ assert_identity_keys_ok(void
    } else {
      /* assert that we have set the client and server keys to be unequal */
      if (server_identitykey)
 -       tor_assert(0!=crypto_pk_cmp_keys(client_identitykey,
 -                                        server_identitykey));
 +      tor_assert(0!=crypto_pk_cmp_keys(client_identitykey,
 +                                       server_identitykey));
    }
  }
  
@@@ -849,21 -847,18 +849,21 @@@ decide_to_advertise_dirport(or_options_
  void
  consider_testing_reachability(int test_or, int test_dir)
  {
 -  routerinfo_t *me = router_get_my_routerinfo();
 +  const routerinfo_t *me = router_get_my_routerinfo();
    int orport_reachable = check_whether_orport_reachable();
    tor_addr_t addr;
    if (!me)
      return;
  
    if (test_or && (!orport_reachable || !circuit_enough_testing_circs())) {
 +    extend_info_t *ei;
      log_info(LD_CIRC, "Testing %s of my ORPort: %s:%d.",
               !orport_reachable ? "reachability" : "bandwidth",
               me->address, me->or_port);
 -    circuit_launch_by_router(CIRCUIT_PURPOSE_TESTING, me,
 -                             CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL);
 +    ei = extend_info_from_router(me);
 +    circuit_launch_by_extend_info(CIRCUIT_PURPOSE_TESTING, ei,
 +                            CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL);
 +    extend_info_free(ei);
    }
  
    tor_addr_from_ipv4h(&addr, me->addr);
@@@ -887,7 -882,7 +887,7 @@@ voi
  router_orport_found_reachable(void)
  {
    if (!can_reach_or_port) {
 -    routerinfo_t *me = router_get_my_routerinfo();
 +    const routerinfo_t *me = router_get_my_routerinfo();
      log_notice(LD_OR,"Self-testing indicates your ORPort is reachable from "
                 "the outside. Excellent.%s",
                 get_options()->_PublishServerDescriptor != NO_AUTHORITY ?
@@@ -910,7 -905,7 +910,7 @@@ voi
  router_dirport_found_reachable(void)
  {
    if (!can_reach_dir_port) {
 -    routerinfo_t *me = router_get_my_routerinfo();
 +    const routerinfo_t *me = router_get_my_routerinfo();
      log_notice(LD_DIRSERV,"Self-testing indicates your DirPort is reachable "
                 "from the outside. Excellent.");
      can_reach_dir_port = 1;
@@@ -1181,7 -1176,7 +1181,7 @@@ static int desc_needs_upload = 0
  void
  router_upload_dir_desc_to_dirservers(int force)
  {
 -  routerinfo_t *ri;
 +  const routerinfo_t *ri;
    extrainfo_t *ei;
    char *msg;
    size_t desc_len, extra_len = 0, total_len;
@@@ -1275,7 -1270,7 +1275,7 @@@ router_extrainfo_digest_is_me(const cha
  
  /** A wrapper around router_digest_is_me(). */
  int
 -router_is_me(routerinfo_t *router)
 +router_is_me(const routerinfo_t *router)
  {
    return router_digest_is_me(router->cache_info.identity_digest);
  }
@@@ -1294,7 -1289,7 +1294,7 @@@ router_fingerprint_is_me(const char *fp
  
  /** Return a routerinfo for this OR, rebuilding a fresh one if
   * necessary.  Return NULL on error, or if called on an OP. */
 -routerinfo_t *
 +const routerinfo_t *
  router_get_my_routerinfo(void)
  {
    if (!server_mode(get_options()))
@@@ -1346,6 -1341,8 +1346,6 @@@ static int router_guess_address_from_di
  int
  router_pick_published_address(or_options_t *options, uint32_t *addr)
  {
 -  char buf[INET_NTOA_BUF_LEN];
 -  struct in_addr a;
    if (resolve_my_address(LOG_INFO, options, addr, NULL) < 0) {
      log_info(LD_CONFIG, "Could not determine our address locally. "
               "Checking if directory headers provide any hints.");
@@@ -1355,7 -1352,9 +1355,7 @@@
        return -1;
      }
    }
 -  a.s_addr = htonl(*addr);
 -  tor_inet_ntoa(&a, buf, sizeof(buf));
 -  log_info(LD_CONFIG,"Success: chose address '%s'.", buf);
 +  log_info(LD_CONFIG,"Success: chose address '%s'.", fmt_addr32(*addr));
    return 0;
  }
  
@@@ -1411,18 -1410,24 +1411,23 @@@ router_rebuild_descriptor(int force
  
    ri->bandwidthcapacity = hibernating ? 0 : rep_hist_bandwidth_assess();
  
-   policies_parse_exit_policy(options->ExitPolicy, &ri->exit_policy,
-                              options->ExitPolicyRejectPrivate,
-                              ri->address, !options->BridgeRelay);
+   if (dns_seems_to_be_broken() || has_dns_init_failed()) {
+     /* DNS is screwed up; don't claim to be an exit. */
+     policies_exit_policy_append_reject_star(&ri->exit_policy);
+   } else {
+     policies_parse_exit_policy(options->ExitPolicy, &ri->exit_policy,
+                                options->ExitPolicyRejectPrivate,
+                                ri->address, !options->BridgeRelay);
+   }
    ri->policy_is_reject_star =
      policy_is_reject_star(ri->exit_policy);
  
 -  if (desc_routerinfo) { /* inherit values */
 -    ri->is_valid = desc_routerinfo->is_valid;
 -    ri->is_running = desc_routerinfo->is_running;
 -    ri->is_named = desc_routerinfo->is_named;
 -  }
 +#if 0
 +  /* XXXX NM NM I belive this is safe to remove */
    if (authdir_mode(options))
      ri->is_valid = ri->is_named = 1; /* believe in yourself */
 +#endif
 +
    if (options->MyFamily) {
      smartlist_t *family;
      if (!warned_nonexistent_family)
@@@ -1431,12 -1436,13 +1436,12 @@@
      ri->declared_family = smartlist_create();
      smartlist_split_string(family, options->MyFamily, ",",
        SPLIT_SKIP_SPACE|SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
 -    SMARTLIST_FOREACH(family, char *, name,
 -     {
 -       routerinfo_t *member;
 +    SMARTLIST_FOREACH_BEGIN(family, char *, name) {
 +       const node_t *member;
         if (!strcasecmp(name, options->Nickname))
 -         member = ri;
 +         goto skip; /* Don't list ourself, that's redundant */
         else
 -         member = router_get_by_nickname(name, 1);
 +         member = node_get_by_nickname(name, 1);
         if (!member) {
           int is_legal = is_legal_nickname_or_hexdigest(name);
           if (!smartlist_string_isin(warned_nonexistent_family, name) &&
@@@ -1456,21 -1462,19 +1461,21 @@@
             smartlist_add(ri->declared_family, name);
             name = NULL;
           }
 -       } else if (router_is_me(member)) {
 +       } else if (router_digest_is_me(member->identity)) {
           /* Don't list ourself in our own family; that's redundant */
 +         /* XXX shouldn't be possible */
         } else {
           char *fp = tor_malloc(HEX_DIGEST_LEN+2);
           fp[0] = '$';
           base16_encode(fp+1,HEX_DIGEST_LEN+1,
 -                       member->cache_info.identity_digest, DIGEST_LEN);
 +                       member->identity, DIGEST_LEN);
           smartlist_add(ri->declared_family, fp);
           if (smartlist_string_isin(warned_nonexistent_family, name))
             smartlist_string_remove(warned_nonexistent_family, name);
         }
 +    skip:
         tor_free(name);
 -     });
 +    } SMARTLIST_FOREACH_END(name);
  
      /* remove duplicates from the list */
      smartlist_sort_strings(ri->declared_family);
@@@ -1531,6 -1535,8 +1536,6 @@@
                           strlen(ri->cache_info.signed_descriptor_body),
                           ri->cache_info.signed_descriptor_digest);
  
 -  routerinfo_set_country(ri);
 -
    if (ei) {
      tor_assert(! routerinfo_incompatible_with_extrainfo(ri, ei, NULL, NULL));
    }
@@@ -1865,9 -1871,7 +1870,7 @@@ router_dump_router_to_string(char *s, s
    }
  
    /* Write the exit policy to the end of 's'. */
-   if (dns_seems_to_be_broken() || has_dns_init_failed() ||
-       !router->exit_policy || !smartlist_len(router->exit_policy)) {
-     /* DNS is screwed up; don't claim to be an exit. */
+   if (!router->exit_policy || !smartlist_len(router->exit_policy)) {
      strlcat(s+written, "reject *:*\n", maxlen-written);
      written += strlen("reject *:*\n");
      tmpe = NULL;
@@@ -2023,12 -2027,6 +2026,12 @@@ extrainfo_dump_to_string(char **s_out, 
    tor_free(bandwidth_usage);
    smartlist_add(chunks, pre);
  
 +  if (geoip_is_loaded()) {
 +    char *chunk=NULL;
 +    tor_asprintf(&chunk, "geoip-db-digest %s\n", geoip_db_digest());
 +    smartlist_add(chunks, chunk);
 +  }
 +
    if (options->ExtraInfoStatistics && write_stats_to_extrainfo) {
      log_info(LD_GENERAL, "Adding stats to extra-info descriptor.");
      if (options->DirReqStatistics &&
@@@ -2051,11 -2049,6 +2054,11 @@@
                          "exit-stats-end", now, &contents) > 0) {
        smartlist_add(chunks, contents);
      }
 +    if (options->ConnDirectionStatistics &&
 +        load_stats_file("stats"PATH_SEPARATOR"conn-stats",
 +                        "conn-bi-direct", now, &contents) > 0) {
 +      smartlist_add(chunks, contents);
 +    }
    }
  
    if (should_record_bridge_info(options) && write_stats_to_extrainfo) {
@@@ -2194,15 -2187,10 +2197,15 @@@ is_legal_hexdigest(const char *s
  void
  router_get_verbose_nickname(char *buf, const routerinfo_t *router)
  {
 +  const char *good_digest = networkstatus_get_router_digest_by_nickname(
 +                                                         router->nickname);
 +  int is_named = good_digest && !memcmp(good_digest,
 +                                        router->cache_info.identity_digest,
 +                                        DIGEST_LEN);
    buf[0] = '$';
    base16_encode(buf+1, HEX_DIGEST_LEN+1, router->cache_info.identity_digest,
                  DIGEST_LEN);
 -  buf[1+HEX_DIGEST_LEN] = router->is_named ? '=' : '~';
 +  buf[1+HEX_DIGEST_LEN] = is_named ? '=' : '~';
    strlcpy(buf+1+HEX_DIGEST_LEN+1, router->nickname, MAX_NICKNAME_LEN+1);
  }
  



More information about the tor-commits mailing list