Loading changes/bug26485 0 → 100644 +4 −0 Original line number Diff line number Diff line o Minor bugfixes (directory authority): - When voting for recommended versions, make sure that all of the versions are well-formed and parsable. Fixes bug 26485; bugfix on 0.1.1.6-alpha. src/or/config.c +8 −1 Original line number Diff line number Diff line Loading @@ -3472,6 +3472,14 @@ options_validate(or_options_t *old_options, or_options_t *options, !options->RecommendedServerVersions)) REJECT("Versioning authoritative dir servers must set " "Recommended*Versions."); char *t; /* Call these functions to produce warnings only. */ t = format_recommended_version_list(options->RecommendedClientVersions, 1); tor_free(t); t = format_recommended_version_list(options->RecommendedServerVersions, 1); tor_free(t); if (options->UseEntryGuards) { log_info(LD_CONFIG, "Authoritative directory servers can't set " "UseEntryGuards. Disabling."); Loading Loading @@ -8399,4 +8407,3 @@ init_cookie_authentication(const char *fname, const char *header, tor_free(cookie_file_str); return retval; } src/or/dirserv.c +37 −6 Original line number Diff line number Diff line Loading @@ -74,7 +74,6 @@ static int routers_with_measured_bw = 0; static void directory_remove_invalid(void); static char *format_versions_list(config_line_t *ln); struct authdir_config_t; static uint32_t dirserv_get_status_impl(const char *fp, const char *nickname, Loading Loading @@ -1061,8 +1060,8 @@ list_server_status_v1(smartlist_t *routers, char **router_status_out, * allocate and return a new string containing the version numbers, in order, * separated by commas. Used to generate Recommended(Client|Server)?Versions */ static char * format_versions_list(config_line_t *ln) char * format_recommended_version_list(const config_line_t *ln, int warn) { smartlist_t *versions; char *result; Loading @@ -1071,6 +1070,37 @@ format_versions_list(config_line_t *ln) smartlist_split_string(versions, ln->value, ",", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); } /* Handle the case where a dirauth operator has accidentally made some * versions space-separated instead of comma-separated. */ smartlist_t *more_versions = smartlist_new(); SMARTLIST_FOREACH_BEGIN(versions, char *, v) { if (strchr(v, ' ')) { if (warn) log_warn(LD_DIRSERV, "Unexpected space in versions list member %s. " "(These are supposed to be comma-separated; I'll pretend you " "used commas instead.)", escaped(v)); SMARTLIST_DEL_CURRENT(versions, v); smartlist_split_string(more_versions, v, NULL, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); tor_free(v); } } SMARTLIST_FOREACH_END(v); smartlist_add_all(versions, more_versions); smartlist_free(more_versions); /* Check to make sure everything looks like a version. */ if (warn) { SMARTLIST_FOREACH_BEGIN(versions, const char *, v) { tor_version_t ver; if (tor_version_parse(v, &ver) < 0) { log_warn(LD_DIRSERV, "Recommended version %s does not look valid. " " (I'll include it anyway, since you told me to.)", escaped(v)); } } SMARTLIST_FOREACH_END(v); } sort_version_list(versions, 1); result = smartlist_join_strings(versions,",",0,NULL); SMARTLIST_FOREACH(versions,char *,s,tor_free(s)); Loading Loading @@ -2911,8 +2941,10 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, } if (options->VersioningAuthoritativeDir) { client_versions = format_versions_list(options->RecommendedClientVersions); server_versions = format_versions_list(options->RecommendedServerVersions); client_versions = format_recommended_version_list(options->RecommendedClientVersions, 0); server_versions = format_recommended_version_list(options->RecommendedServerVersions, 0); } contact = get_options()->ContactInfo; Loading Loading @@ -4062,4 +4094,3 @@ dirserv_free_all(void) dirserv_clear_measured_bw_cache(); } src/or/dirserv.h +1 −2 Original line number Diff line number Diff line Loading @@ -155,7 +155,7 @@ char *routerstatus_format_entry( void dirserv_free_all(void); void cached_dir_decref(cached_dir_t *d); cached_dir_t *new_cached_dir(char *s, time_t published); char *format_recommended_version_list(const config_line_t *line, int warn); int validate_recommended_package_line(const char *line); #ifdef DIRSERV_PRIVATE Loading Loading @@ -208,4 +208,3 @@ void dirserv_spool_sort(dir_connection_t *conn); void dir_conn_clear_spool(dir_connection_t *conn); #endif /* !defined(TOR_DIRSERV_H) */ src/or/dirvote.c +8 −1 Original line number Diff line number Diff line Loading @@ -707,6 +707,14 @@ compute_consensus_versions_list(smartlist_t *lst, int n_versioning) int min = n_versioning / 2; smartlist_t *good = smartlist_new(); char *result; SMARTLIST_FOREACH_BEGIN(lst, const char *, v) { if (strchr(v, ' ')) { log_warn(LD_DIR, "At least one authority has voted for a version %s " "that contains a space. This probably wasn't intentional, and " "is likely to cause trouble. Please tell them to stop it.", escaped(v)); } } SMARTLIST_FOREACH_END(v); sort_version_list(lst, 0); get_frequent_members(good, lst, min); result = smartlist_join_strings(good, ",", 0, NULL); Loading Loading @@ -4077,4 +4085,3 @@ vote_routerstatus_find_microdesc_hash(char *digest256_out, } return -1; } Loading
changes/bug26485 0 → 100644 +4 −0 Original line number Diff line number Diff line o Minor bugfixes (directory authority): - When voting for recommended versions, make sure that all of the versions are well-formed and parsable. Fixes bug 26485; bugfix on 0.1.1.6-alpha.
src/or/config.c +8 −1 Original line number Diff line number Diff line Loading @@ -3472,6 +3472,14 @@ options_validate(or_options_t *old_options, or_options_t *options, !options->RecommendedServerVersions)) REJECT("Versioning authoritative dir servers must set " "Recommended*Versions."); char *t; /* Call these functions to produce warnings only. */ t = format_recommended_version_list(options->RecommendedClientVersions, 1); tor_free(t); t = format_recommended_version_list(options->RecommendedServerVersions, 1); tor_free(t); if (options->UseEntryGuards) { log_info(LD_CONFIG, "Authoritative directory servers can't set " "UseEntryGuards. Disabling."); Loading Loading @@ -8399,4 +8407,3 @@ init_cookie_authentication(const char *fname, const char *header, tor_free(cookie_file_str); return retval; }
src/or/dirserv.c +37 −6 Original line number Diff line number Diff line Loading @@ -74,7 +74,6 @@ static int routers_with_measured_bw = 0; static void directory_remove_invalid(void); static char *format_versions_list(config_line_t *ln); struct authdir_config_t; static uint32_t dirserv_get_status_impl(const char *fp, const char *nickname, Loading Loading @@ -1061,8 +1060,8 @@ list_server_status_v1(smartlist_t *routers, char **router_status_out, * allocate and return a new string containing the version numbers, in order, * separated by commas. Used to generate Recommended(Client|Server)?Versions */ static char * format_versions_list(config_line_t *ln) char * format_recommended_version_list(const config_line_t *ln, int warn) { smartlist_t *versions; char *result; Loading @@ -1071,6 +1070,37 @@ format_versions_list(config_line_t *ln) smartlist_split_string(versions, ln->value, ",", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); } /* Handle the case where a dirauth operator has accidentally made some * versions space-separated instead of comma-separated. */ smartlist_t *more_versions = smartlist_new(); SMARTLIST_FOREACH_BEGIN(versions, char *, v) { if (strchr(v, ' ')) { if (warn) log_warn(LD_DIRSERV, "Unexpected space in versions list member %s. " "(These are supposed to be comma-separated; I'll pretend you " "used commas instead.)", escaped(v)); SMARTLIST_DEL_CURRENT(versions, v); smartlist_split_string(more_versions, v, NULL, SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); tor_free(v); } } SMARTLIST_FOREACH_END(v); smartlist_add_all(versions, more_versions); smartlist_free(more_versions); /* Check to make sure everything looks like a version. */ if (warn) { SMARTLIST_FOREACH_BEGIN(versions, const char *, v) { tor_version_t ver; if (tor_version_parse(v, &ver) < 0) { log_warn(LD_DIRSERV, "Recommended version %s does not look valid. " " (I'll include it anyway, since you told me to.)", escaped(v)); } } SMARTLIST_FOREACH_END(v); } sort_version_list(versions, 1); result = smartlist_join_strings(versions,",",0,NULL); SMARTLIST_FOREACH(versions,char *,s,tor_free(s)); Loading Loading @@ -2911,8 +2941,10 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, } if (options->VersioningAuthoritativeDir) { client_versions = format_versions_list(options->RecommendedClientVersions); server_versions = format_versions_list(options->RecommendedServerVersions); client_versions = format_recommended_version_list(options->RecommendedClientVersions, 0); server_versions = format_recommended_version_list(options->RecommendedServerVersions, 0); } contact = get_options()->ContactInfo; Loading Loading @@ -4062,4 +4094,3 @@ dirserv_free_all(void) dirserv_clear_measured_bw_cache(); }
src/or/dirserv.h +1 −2 Original line number Diff line number Diff line Loading @@ -155,7 +155,7 @@ char *routerstatus_format_entry( void dirserv_free_all(void); void cached_dir_decref(cached_dir_t *d); cached_dir_t *new_cached_dir(char *s, time_t published); char *format_recommended_version_list(const config_line_t *line, int warn); int validate_recommended_package_line(const char *line); #ifdef DIRSERV_PRIVATE Loading Loading @@ -208,4 +208,3 @@ void dirserv_spool_sort(dir_connection_t *conn); void dir_conn_clear_spool(dir_connection_t *conn); #endif /* !defined(TOR_DIRSERV_H) */
src/or/dirvote.c +8 −1 Original line number Diff line number Diff line Loading @@ -707,6 +707,14 @@ compute_consensus_versions_list(smartlist_t *lst, int n_versioning) int min = n_versioning / 2; smartlist_t *good = smartlist_new(); char *result; SMARTLIST_FOREACH_BEGIN(lst, const char *, v) { if (strchr(v, ' ')) { log_warn(LD_DIR, "At least one authority has voted for a version %s " "that contains a space. This probably wasn't intentional, and " "is likely to cause trouble. Please tell them to stop it.", escaped(v)); } } SMARTLIST_FOREACH_END(v); sort_version_list(lst, 0); get_frequent_members(good, lst, min); result = smartlist_join_strings(good, ",", 0, NULL); Loading Loading @@ -4077,4 +4085,3 @@ vote_routerstatus_find_microdesc_hash(char *digest256_out, } return -1; }