dirparse: add helper for recommended/required protocols

This commit is contained in:
cypherpunks 2020-02-08 21:16:26 +00:00
parent 8d89aa5eea
commit c2b95da4d4

View File

@ -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 /** Parse a v3 networkstatus vote, opinion, or consensus (depending on
* ns_type), from <b>s</b>, and return the result. Return NULL on failure. */ * ns_type), from <b>s</b>, and return the result. Return NULL on failure. */
networkstatus_t * 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. // Reject the vote if any of the protocols lines are malformed.
if ((tok = find_opt_by_keyword(tokens, K_RECOMMENDED_CLIENT_PROTOCOLS))) { bool unparseable = false;
if (protover_contains_long_protocol_names(tok->args[0])) ns->recommended_client_protocols = dup_protocols_string(tokens, &unparseable,
goto err; K_RECOMMENDED_CLIENT_PROTOCOLS);
ns->recommended_client_protocols = tor_strdup(tok->args[0]); ns->recommended_relay_protocols = dup_protocols_string(tokens, &unparseable,
} K_RECOMMENDED_RELAY_PROTOCOLS);
if ((tok = find_opt_by_keyword(tokens, K_RECOMMENDED_RELAY_PROTOCOLS))) { ns->required_client_protocols = dup_protocols_string(tokens, &unparseable,
if (protover_contains_long_protocol_names(tok->args[0])) K_REQUIRED_CLIENT_PROTOCOLS);
goto err; ns->required_relay_protocols = dup_protocols_string(tokens, &unparseable,
ns->recommended_relay_protocols = tor_strdup(tok->args[0]); K_REQUIRED_RELAY_PROTOCOLS);
} if (unparseable)
if ((tok = find_opt_by_keyword(tokens, K_REQUIRED_CLIENT_PROTOCOLS))) { goto err;
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); tok = find_by_keyword(tokens, K_VALID_AFTER);
if (parse_iso_time(tok->args[0], &ns->valid_after)) if (parse_iso_time(tok->args[0], &ns->valid_after))