From b13496b62adfb3ff7f44b3e9dc5d367d08309c79 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Mon, 16 Feb 2009 15:15:06 +0000 Subject: [PATCH] Possible fix for broken country settings in ExcludeExitNodes. It turns out that we weren't updating the _ExcludeExitNodesUnion set's country numbers when we reloaded (or first loaded!) the IP-to-country file. Spotted by Lark. Bugfix on 0.2.1.6-alpha. svn:r18575 --- ChangeLog | 5 +++++ src/or/config.c | 11 ----------- src/or/geoip.c | 5 +++++ src/or/or.h | 1 + src/or/routerlist.c | 20 ++++++++++++++++++++ 5 files changed, 31 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 293c9a376a..ffb4a1030e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ Changes in version 0.2.1.13-????? - 2009-02-?? + o Major bugfixes: + - Correctly update the list of countries to exclude as exits when + the GeoIP file is loaded or reloaded. Diagnosed by lark. Bugfix + on 0.2.1.6-alpha. + o Minor bugfixes: - Automatically detect MacOSX versions earlier than 10.4.0, and disable kqueue from inside Tor when running with these versions. diff --git a/src/or/config.c b/src/or/config.c index cb624fbd63..6b89eceb5a 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -1372,17 +1372,6 @@ options_act(or_options_t *old_options) #endif geoip_load_file(actual_fname, options); tor_free(actual_fname); - - /* XXXX Would iterating through all option_var's routersets be better? */ - if (options->EntryNodes) - routerset_refresh_countries(options->EntryNodes); - if (options->ExitNodes) - routerset_refresh_countries(options->ExitNodes); - if (options->ExcludeNodes) - routerset_refresh_countries(options->ExcludeNodes); - if (options->ExcludeExitNodes) - routerset_refresh_countries(options->ExcludeExitNodes); - routerlist_refresh_countries(); } /* Check if we need to parse and add the EntryNodes config option. */ if (options->EntryNodes && diff --git a/src/or/geoip.c b/src/or/geoip.c index 4c61dd27f7..61f1207e59 100644 --- a/src/or/geoip.c +++ b/src/or/geoip.c @@ -206,6 +206,11 @@ geoip_load_file(const char *filename, or_options_t *options) fclose(f); smartlist_sort(geoip_entries, _geoip_compare_entries); + + /* Okay, now we need to maybe change our mind about what is in which + * country. */ + refresh_all_country_info(); + return 0; } diff --git a/src/or/or.h b/src/or/or.h index 7c191eeaf3..e55d324284 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -4514,6 +4514,7 @@ int routerset_equal(const routerset_t *old, const routerset_t *new); void routerset_free(routerset_t *routerset); void routerinfo_set_country(routerinfo_t *ri); void routerlist_refresh_countries(void); +void refresh_all_country_info(void); int hid_serv_get_responsible_directories(smartlist_t *responsible_dirs, const char *id); diff --git a/src/or/routerlist.c b/src/or/routerlist.c index ecbc323937..080603b7e9 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -5020,6 +5020,26 @@ routerset_parse(routerset_t *target, const char *s, const char *description) return r; } +/** DOCDOC */ +void +refresh_all_country_info(void) +{ + or_options_t *options = get_options(); + + if (options->EntryNodes) + routerset_refresh_countries(options->EntryNodes); + if (options->ExitNodes) + routerset_refresh_countries(options->ExitNodes); + if (options->ExcludeNodes) + routerset_refresh_countries(options->ExcludeNodes); + if (options->ExcludeExitNodes) + routerset_refresh_countries(options->ExcludeExitNodes); + if (options->_ExcludeExitNodesUnion) + routerset_refresh_countries(options->_ExcludeExitNodesUnion); + + routerlist_refresh_countries(); +} + /** Add all members of the set source to target. */ void routerset_union(routerset_t *target, const routerset_t *source) -- 2.11.4.GIT