diff options
author | Nick Mathewson <nickm@torproject.org> | 2004-07-16 23:33:42 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2004-07-16 23:33:42 +0000 |
commit | df3544422c35f85cc9990b78a3a5e3ec3c5b67a0 (patch) | |
tree | b614919048f1c97b1be44606017daaa4c36ddc0e /src | |
parent | 10407625312cb43e92ef68f9b98a6b0aaa23a22b (diff) | |
download | tor-df3544422c35f85cc9990b78a3a5e3ec3c5b67a0.tar tor-df3544422c35f85cc9990b78a3a5e3ec3c5b67a0.tar.gz |
Change rule from "reject non-recommended versions" to "reject obsolete versions". A version is "obsolete" if it is non-recommended, and at least one recommended version is newer than it.
svn:r2052
Diffstat (limited to 'src')
-rw-r--r-- | src/or/routerparse.c | 89 | ||||
-rw-r--r-- | src/or/test.c | 22 |
2 files changed, 58 insertions, 53 deletions
diff --git a/src/or/routerparse.c b/src/or/routerparse.c index 137db14b4..b9db79d7b 100644 --- a/src/or/routerparse.c +++ b/src/or/routerparse.c @@ -221,25 +221,58 @@ get_recommended_software_from_directory(const char *str) #undef REC } -/** Return 1 if myversion is in versionlist. Else return 0. - * (versionlist is a comma-separated list of versions.) */ -/* static */ int is_recommended_version(const char *myversion, +/** Return 1 if <b>myversion</b> is not in <b>versionlist</b>, and if at least + * one version of Tor on <b>versionlist</b> is newer than <b>myversion</b>. + * Otherwise return 0. + * (versionlist is a comma-separated list of version strings, + * optionally prefixed with "Tor". Versions that can't be parsed are + * ignored.) */ +/* static */ int is_obsolete_version(const char *myversion, const char *versionlist) { - int len_myversion = strlen(myversion); - char *comma; - const char *end = versionlist + strlen(versionlist); + char *version, *comma, *cp; + tor_version_t mine, other; + int found_newer = 0, r; log_fn(LOG_DEBUG,"checking '%s' in '%s'.", myversion, versionlist); + if (tor_version_parse(myversion, &mine)) { + log_fn(LOG_ERR, "I couldn't parse my own version (%s)", myversion); + tor_assert(0); + } + for(;;) { comma = strchr(versionlist, ','); - if( ((comma ? comma : end) - versionlist == len_myversion) && - !strncmp(versionlist, myversion, len_myversion)) - /* only do strncmp if the length matches */ - return 1; /* success, it's there */ - if(!comma) - return 0; /* nope */ - versionlist = comma+1; + version = tor_strndup(versionlist, + comma?(comma-versionlist):strlen(versionlist)); + cp = version; + while (isspace(*cp)) + ++cp; + if (!strncmp(cp, "Tor ", 4)) + cp += 4; + + if (tor_version_parse(cp, &other)) { + /* Couldn't parse other; it can't be a match. */ + } else { + r = tor_version_compare(&mine, &other); + if (r==0) { + tor_free(version); + return 0; /* It's a match. */ + } else if (r<0) { + found_newer = 1; + } + } + tor_free(version); + if (comma) + versionlist = comma+1; + else + break; + } + if (!found_newer) { + log_fn(LOG_WARN, "This version of Tor (%s) is newer than any on the recommended list (%s)", + myversion, versionlist); + return 0; + } else { + return 1; } } @@ -254,11 +287,7 @@ int check_software_version_against_directory(const char *directory, log_fn(LOG_WARN, "No recommended-versions string found in directory"); return -1; } - /* Look for versions of the form "0.1.0" and of the form "Tor 0.1.0". - * Eventually, we should deprecate the first form. - */ - if (is_recommended_version(VERSION, v) || - is_recommended_version("Tor "VERSION, v)) { + if (!is_obsolete_version(VERSION, v)) { tor_free(v); return 0; } @@ -1377,30 +1406,6 @@ int tor_version_compare(tor_version_t *a, tor_version_t *b) return 0; } -static tor_version_t *my_tor_version=NULL; - -/** 1 for unequal, newer or can't tell; 0 for equal, -1 for older. */ -int tor_version_compare_to_mine(const char *s) -{ - tor_version_t v; - - if (!my_tor_version) { - my_tor_version = tor_malloc(sizeof(tor_version_t)); - if (tor_version_parse(VERSION, my_tor_version)) { - log_fn(LOG_ERR, "I couldn't parse my own version ("VERSION")"); - exit(1); - } - } - - if (tor_version_parse(s,&v)) { - log_fn(LOG_WARN, "Unparseable tor version %s", s); - return 1; - } - - return tor_version_compare(my_tor_version, &v); -} - - /* Local Variables: mode:c diff --git a/src/or/test.c b/src/or/test.c index d92a45987..1acd13f18 100644 --- a/src/or/test.c +++ b/src/or/test.c @@ -647,7 +647,7 @@ test_onion_handshake() { } /* from routerparse.c */ -int is_recommended_version(const char *myversion, const char *start); +int is_obsolete_version(const char *myversion, const char *start); void test_dir_format() @@ -816,16 +816,6 @@ test_dir_format() tor_free(dir1); /* XXXX And more !*/ tor_free(dir2); /* And more !*/ - /* make sure is_recommended_version() works */ - test_eq(1, is_recommended_version("abc", "abc")); - test_eq(1, is_recommended_version("abc", "ab,abd,abde,abc,abcde")); - test_eq(1, is_recommended_version("abc", "ab,abd,abde,abcde,abc")); - test_eq(1, is_recommended_version("abc", "abc,abd,abde,abc,abcde")); - test_eq(1, is_recommended_version("a", "a,ab,abd,abde,abc,abcde")); - test_eq(0, is_recommended_version("a", "ab,abd,abde,abc,abcde")); - test_eq(0, is_recommended_version("abb", "ab,abd,abde,abc,abcde")); - test_eq(0, is_recommended_version("a", "")); - /* Try out version parsing functionality */ test_eq(0, tor_version_parse("0.3.4pre2-cvs", &ver1)); test_eq(0, ver1.major); @@ -855,6 +845,16 @@ test_dir_format() test_eq(VER_RELEASE, ver1.status); test_eq(999, ver1.patchlevel); test_eq(IS_NOT_CVS, ver1.cvs); + + /* make sure is_obsolete_version() works */ + test_eq(1, is_obsolete_version("0.0.1", "Tor 0.0.2")); + test_eq(1, is_obsolete_version("0.0.1", "0.0.2, Tor 0.0.3")); + test_eq(1, is_obsolete_version("0.0.1", "0.0.2,Tor 0.0.3")); + test_eq(1, is_obsolete_version("0.0.1", "0.0.3,BetterTor 0.0.1")); + test_eq(0, is_obsolete_version("0.0.2", "Tor 0.0.2,Tor 0.0.3")); + test_eq(1, is_obsolete_version("0.0.2", "Tor 0.0.2pre1,Tor 0.0.3")); + test_eq(0, is_obsolete_version("0.1.0", "Tor 0.0.2,Tor 0.0.3")); + test_eq(0, is_obsolete_version("0.0.7rc2", "0.0.7,Tor 0.0.7rc2,Tor 0.0.8")); } void test_rend_fns() |