Loading src/feature/dirparse/ns_parse.c +24 −20 Original line number Diff line number Diff line Loading @@ -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 * Loading Loading @@ -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)) Loading Loading
src/feature/dirparse/ns_parse.c +24 −20 Original line number Diff line number Diff line Loading @@ -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 * Loading Loading @@ -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)) Loading