[or-cvs] Check recommended-software string *early*, before actually ...
Nick Mathewson
nickm at seul.org
Tue Jun 1 18:19:04 UTC 2004
Update of /home/or/cvsroot/src/or
In directory moria.mit.edu:/tmp/cvs-serv593/src/or
Modified Files:
or.h routerlist.c routerparse.c test.c
Log Message:
Check recommended-software string *early*, before actually parsing the directory.
Index: or.h
===================================================================
RCS file: /home/or/cvsroot/src/or/or.h,v
retrieving revision 1.359
retrieving revision 1.360
diff -u -d -r1.359 -r1.360
--- or.h 1 Jun 2004 17:03:01 -0000 1.359
+++ or.h 1 Jun 2004 18:19:01 -0000 1.360
@@ -1334,6 +1334,9 @@
routerinfo_t *router_parse_entry_from_string(const char *s, const char *end);
int router_add_exit_policy_from_string(routerinfo_t *router, const char *s);
struct exit_policy_t *router_parse_exit_policy_from_string(const char *s);
+int check_software_version_against_directory(const char *directory,
+ int ignoreversion);
+
#endif
Index: routerlist.c
===================================================================
RCS file: /home/or/cvsroot/src/or/routerlist.c,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -d -r1.82 -r1.83
--- routerlist.c 20 May 2004 19:12:28 -0000 1.82
+++ routerlist.c 1 Jun 2004 18:19:01 -0000 1.83
@@ -445,34 +445,13 @@
return 0;
}
-/** Return 1 if myversion is in versionlist. Else return 0.
- * (versionlist is a comma-separated list of versions.) */
-int is_recommended_version(const char *myversion,
- const char *versionlist) {
- int len_myversion = strlen(myversion);
- char *comma;
- const char *end = versionlist + strlen(versionlist);
-
- log_fn(LOG_DEBUG,"checking '%s' in '%s'.", myversion, versionlist);
-
- 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;
- }
-}
-
/** Add to the current routerlist each router stored in the
* signed directory <b>s</b>. If pkey is provided, make sure that <b>s</b> is
* signed with pkey. */
int router_load_routerlist_from_directory(const char *s, crypto_pk_env_t *pkey)
{
routerlist_t *new_list = NULL;
+ check_software_version_against_directory(s, options.IgnoreVersion);
if (router_parse_routerlist_from_directory(s, &new_list, pkey)) {
log_fn(LOG_WARN, "Couldn't parse directory.");
return -1;
@@ -493,19 +472,6 @@
log_fn(LOG_WARN, "Error resolving routerlist");
return -1;
}
- if (!is_recommended_version(VERSION, routerlist->software_versions)) {
- 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.",
- VERSION, strchr(routerlist->software_versions,',') ? "one of " : "",
- routerlist->software_versions);
- if(options.IgnoreVersion) {
- log(LOG_WARN, "IgnoreVersion is set. If it breaks, we told you so.");
- } else {
- fflush(0);
- exit(0);
- }
- }
return 0;
}
Index: routerparse.c
===================================================================
RCS file: /home/or/cvsroot/src/or/routerparse.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- routerparse.c 20 May 2004 02:42:50 -0000 1.3
+++ routerparse.c 1 Jun 2004 18:19:01 -0000 1.4
@@ -176,6 +176,89 @@
return 0;
}
+/**
+ * Find the first instance of "recommended-software ...\n" at the start of
+ * a line; return a newly allocated string containing the "..." portion.
+ * Return NULL if no such instance was found.
+ */
+static char *
+get_recommended_software_from_directory(const char *str)
+{
+#define REC "recommended-software "
+ const char *cp = str, *eol;
+ int len = strlen(REC);
+ cp = str;
+ if (strncmp(str, REC, len)==0) {
+ cp += len;
+ } else {
+ cp = strstr(str, "\n"REC);
+ if (!cp)
+ return NULL;
+ cp += len+1;
+ }
+ eol = strchr(cp, '\n');
+ if (!eol)
+ return NULL;
+ return tor_strndup(cp, eol-cp);
+#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,
+ const char *versionlist) {
+ int len_myversion = strlen(myversion);
+ char *comma;
+ const char *end = versionlist + strlen(versionlist);
+
+ log_fn(LOG_DEBUG,"checking '%s' in '%s'.", myversion, versionlist);
+
+ 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;
+ }
+}
+
+/* Return 0 if myversion is supported; else log a message and return
+ * -1 (or exit if ignoreversions is false) */
+int check_software_version_against_directory(const char *directory,
+ int ignoreversion)
+{
+ char *v;
+ v = get_recommended_software_from_directory(directory);
+ if (!v) {
+ 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)) {
+ tor_free(v);
+ return 0;
+ }
+ log(ignoreversion ? LOG_WARN : LOG_ERR,
+ "You are running Tor version %s, which will not work with this network.\n"
+ "Please use %s%s.",
+ VERSION, strchr(v,',') ? "one of " : "", v);
+ tor_free(v);
+
+ if(ignoreversion) {
+ log(LOG_WARN, "IgnoreVersion is set. If it breaks, we told you so.");
+ return -1;
+ } else {
+ fflush(0);
+ exit(0);
+ return -1; /* never reached */
+ }
+}
/** Parse a directory from <b>s</b> and, when done, store the
* resulting routerlist in *<b>dest</b>, freeing the old value if necessary.
Index: test.c
===================================================================
RCS file: /home/or/cvsroot/src/or/test.c,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -d -r1.92 -r1.93
--- test.c 12 May 2004 19:30:28 -0000 1.92
+++ test.c 1 Jun 2004 18:19:01 -0000 1.93
@@ -635,8 +635,8 @@
crypto_free_pk_env(pk);
}
-/* from routers.c */
-int is_recommended_version(char *myversion, char *start);
+/* from routerparse.c */
+int is_recommended_version(const char *myversion, const char *start);
void
test_dir_format()
More information about the tor-commits
mailing list