|
@@ -72,7 +72,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,
|
|
@@ -1032,8 +1031,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;
|
|
@@ -1042,6 +1041,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));
|
|
@@ -2860,8 +2890,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;
|
|
@@ -3879,4 +3911,3 @@ dirserv_free_all(void)
|
|
|
|
|
|
dirserv_clear_measured_bw_cache();
|
|
|
}
|
|
|
-
|