]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
protover: reject invalid protocol names
authorcypherpunks <cypherpunks@torproject.org>
Sun, 26 Aug 2018 01:20:44 +0000 (01:20 +0000)
committercypherpunks <cypherpunks@torproject.org>
Fri, 14 Sep 2018 02:18:04 +0000 (02:18 +0000)
The spec only allows the characters [A-Za-z0-9-].

Fix on b2b2e1c7f24d9b65059e3d089768d6c49ba4f58f.
Fixes #27316; bugfix on 0.2.9.4-alpha.

changes/bug27316 [new file with mode: 0644]
src/or/protover.c
src/test/test_protover.c

diff --git a/changes/bug27316 b/changes/bug27316
new file mode 100644 (file)
index 0000000..cec9348
--- /dev/null
@@ -0,0 +1,3 @@
+  o Minor bugfixes (protover):
+    - Reject protocol names containing bytes other than alphanumeric characters
+      and hyphens ([A-Za-z0-9-]). Fixes bug 27316; bugfix on 0.2.9.4-alpha.
index 31ca13fe61246e269fc859e9bc62dc55e08ad81c..2c5d5ab1fc2771dc49574b4d7d7874cd8cacc3a7 100644 (file)
@@ -23,6 +23,7 @@
 
 #define PROTOVER_PRIVATE
 
+#include "compat.h"
 #include "or.h"
 #include "protover.h"
 #include "routerparse.h"
@@ -170,6 +171,16 @@ parse_version_range(const char *s, const char *end_of_range,
   return -1;
 }
 
+static int
+is_valid_keyword(const char *s, size_t n)
+{
+  for (size_t i = 0; i < n; i++) {
+    if (!TOR_ISALNUM(s[i]) && s[i] != '-')
+      return 0;
+  }
+  return 1;
+}
+
 /** Parse a single protocol entry from <b>s</b> up to an optional
  * <b>end_of_entry</b> pointer, and return that protocol entry. Return NULL
  * on error.
@@ -195,6 +206,10 @@ parse_single_entry(const char *s, const char *end_of_entry)
   if (equals == s)
     goto error;
 
+  /* The name must contain only alphanumeric characters and hyphens. */
+  if (!is_valid_keyword(s, equals-s))
+    goto error;
+
   out->name = tor_strndup(s, equals-s);
 
   tor_assert(equals < end_of_entry);
index 92ead3ca37fd668431b1002816cf1f8a79eb8846..c4379a15e1bcc24d638734dd7a7fd90e75d77b09 100644 (file)
@@ -283,6 +283,10 @@ test_protover_vote_roundtrip(void *args)
     const char *input;
     const char *expected_output;
   } examples[] = {
+    { "Risqu\u00e9=1", NULL },
+    { ",,,=1", NULL },
+    { "\xc1=1", NULL },
+    { "Foo_Bar=1", NULL },
     { "Fkrkljdsf", NULL },
     { "Zn=4294967295", NULL },
     { "Zn=4294967295-1", NULL },