aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2004-03-28 04:54:36 +0000
committerRoger Dingledine <arma@torproject.org>2004-03-28 04:54:36 +0000
commitf241fdfc739c08779603f2590e484ba1e405867a (patch)
tree67d85bae0650d90f8e43439b7a2a6428574730a7 /src
parentdf57d3ff3a51e863a133e3bdbc6ecaa0be7f6e7e (diff)
downloadtor-f241fdfc739c08779603f2590e484ba1e405867a.tar
tor-f241fdfc739c08779603f2590e484ba1e405867a.tar.gz
there is yet another dns-pending-conn-clobbering bug
somewhere svn:r1354
Diffstat (limited to 'src')
-rw-r--r--src/or/dns.c13
-rw-r--r--src/or/or.h1
-rw-r--r--src/or/routerlist.c13
-rw-r--r--src/or/test.c20
4 files changed, 31 insertions, 16 deletions
diff --git a/src/or/dns.c b/src/or/dns.c
index 61aa55458..ebe52e2db 100644
--- a/src/or/dns.c
+++ b/src/or/dns.c
@@ -237,6 +237,19 @@ void connection_dns_remove(connection_t *conn)
}
}
+void assert_connection_edge_not_dns_pending(connection_t *conn) {
+ struct pending_connection_t *pend;
+ struct cached_resolve *resolve;
+
+ SPLAY_FOREACH(resolve, cache_tree, &cache_root) {
+ for(pend = resolve->pending_connections;
+ pend;
+ pend = pend->next) {
+ assert(pend->conn != conn);
+ }
+ }
+}
+
/* Cancel all pending connections. Then cancel the resolve itself,
* and remove the 'struct cached_resolve' from the cache.
*/
diff --git a/src/or/or.h b/src/or/or.h
index f19817e6a..25c8420b7 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -801,6 +801,7 @@ void dns_init(void);
int connection_dns_finished_flushing(connection_t *conn);
int connection_dns_process_inbuf(connection_t *conn);
void connection_dns_remove(connection_t *conn);
+void assert_connection_edge_not_dns_pending(connection_t *conn);
void dns_cancel_pending_resolve(char *question);
int dns_resolve(connection_t *exitconn);
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 76baa9c8e..923f8b3c5 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -357,10 +357,10 @@ int router_get_router_hash(const char *s, char *digest)
"router ","router-signature");
}
-/* return 0 if myversion is in versionlist. Else return -1.
+/* return 1 if myversion is in versionlist. Else return 0.
* (versionlist contains a comma-separated list of versions.) */
-int compare_recommended_versions(const char *myversion,
- const char *versionlist) {
+int is_recommended_version(const char *myversion,
+ const char *versionlist) {
int len_myversion = strlen(myversion);
char *comma;
const char *end = versionlist + strlen(versionlist);
@@ -372,9 +372,9 @@ int compare_recommended_versions(const char *myversion,
if( ((comma ? comma : end) - versionlist == len_myversion) &&
!strncmp(versionlist, myversion, len_myversion))
/* only do strncmp if the length matches */
- return 0; /* success, it's there */
+ return 1; /* success, it's there */
if(!comma)
- return -1; /* nope */
+ return 0; /* nope */
versionlist = comma+1;
}
}
@@ -391,7 +391,8 @@ int router_set_routerlist_from_directory(const char *s, crypto_pk_env_t *pkey)
log_fn(LOG_WARN, "Error resolving routerlist");
return -1;
}
- if (compare_recommended_versions(VERSION, routerlist->software_versions) < 0) {
+ if (is_recommended_version(VERSION,
+ routerlist->software_versions) < 0) {
log(options.IgnoreVersion ? LOG_WARN : LOG_ERR,
"You are running Tor version %s, which will not work with this network.\n"
"Please use %s%s.",
diff --git a/src/or/test.c b/src/or/test.c
index af11a4b7f..303400756 100644
--- a/src/or/test.c
+++ b/src/or/test.c
@@ -611,7 +611,7 @@ test_onion_handshake() {
}
/* from routers.c */
-int compare_recommended_versions(char *myversion, char *start);
+int is_recommended_version(char *myversion, char *start);
void
test_dir_format()
@@ -766,15 +766,15 @@ test_dir_format()
tor_free(dir1); /* And more !*/
tor_free(dir2); /* And more !*/
- /* make sure compare_recommended_versions() works */
- test_eq(0, compare_recommended_versions("abc", "abc"));
- test_eq(0, compare_recommended_versions("abc", "ab,abd,abde,abc,abcde"));
- test_eq(0, compare_recommended_versions("abc", "ab,abd,abde,abcde,abc"));
- test_eq(0, compare_recommended_versions("abc", "abc,abd,abde,abc,abcde"));
- test_eq(0, compare_recommended_versions("a", "a,ab,abd,abde,abc,abcde"));
- test_eq(-1, compare_recommended_versions("a", "ab,abd,abde,abc,abcde"));
- test_eq(-1, compare_recommended_versions("abb", "ab,abd,abde,abc,abcde"));
- test_eq(-1, compare_recommended_versions("a", ""));
+ /* 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", ""));
}
int