Commit c2b95da4 authored by cypherpunks's avatar cypherpunks
Browse files

dirparse: add helper for recommended/required protocols

parent 8d89aa5e
Loading
Loading
Loading
Loading
+24 −20
Original line number Diff line number Diff line
@@ -1053,6 +1053,19 @@ extract_shared_random_srvs(networkstatus_t *ns, smartlist_t *tokens)
  }
}

/** Allocate a copy of a protover line, if present. If present but malformed,
 * set *error to true. */
static char *
dup_protocols_string(smartlist_t *tokens, bool *error, directory_keyword kw)
{
  directory_token_t *tok = find_opt_by_keyword(tokens, kw);
  if (!tok)
    return NULL;
  if (protover_contains_long_protocol_names(tok->args[0]))
    *error = true;
  return tor_strdup(tok->args[0]);
}

/** Parse a v3 networkstatus vote, opinion, or consensus (depending on
 * ns_type), from <b>s</b>, and return the result.  Return NULL on failure. */
networkstatus_t *
@@ -1169,26 +1182,17 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out,
  }

  // Reject the vote if any of the protocols lines are malformed.
  if ((tok = find_opt_by_keyword(tokens, K_RECOMMENDED_CLIENT_PROTOCOLS))) {
    if (protover_contains_long_protocol_names(tok->args[0]))
      goto err;
    ns->recommended_client_protocols = tor_strdup(tok->args[0]);
  }
  if ((tok = find_opt_by_keyword(tokens, K_RECOMMENDED_RELAY_PROTOCOLS))) {
    if (protover_contains_long_protocol_names(tok->args[0]))
  bool unparseable = false;
  ns->recommended_client_protocols = dup_protocols_string(tokens, &unparseable,
                                         K_RECOMMENDED_CLIENT_PROTOCOLS);
  ns->recommended_relay_protocols = dup_protocols_string(tokens, &unparseable,
                                         K_RECOMMENDED_RELAY_PROTOCOLS);
  ns->required_client_protocols = dup_protocols_string(tokens, &unparseable,
                                         K_REQUIRED_CLIENT_PROTOCOLS);
  ns->required_relay_protocols = dup_protocols_string(tokens, &unparseable,
                                         K_REQUIRED_RELAY_PROTOCOLS);
  if (unparseable)
    goto err;
    ns->recommended_relay_protocols = tor_strdup(tok->args[0]);
  }
  if ((tok = find_opt_by_keyword(tokens, K_REQUIRED_CLIENT_PROTOCOLS))) {
    if (protover_contains_long_protocol_names(tok->args[0]))
      goto err;
    ns->required_client_protocols = tor_strdup(tok->args[0]);
  }
  if ((tok = find_opt_by_keyword(tokens, K_REQUIRED_RELAY_PROTOCOLS))) {
    if (protover_contains_long_protocol_names(tok->args[0]))
      goto err;
    ns->required_relay_protocols = tor_strdup(tok->args[0]);
  }

  tok = find_by_keyword(tokens, K_VALID_AFTER);
  if (parse_iso_time(tok->args[0], &ns->valid_after))