]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Enforce transport names being C identifiers.
authorGeorge Kadianakis <desnacked@gmail.com>
Sun, 11 Sep 2011 21:34:11 +0000 (23:34 +0200)
committerGeorge Kadianakis <desnacked@gmail.com>
Sun, 11 Sep 2011 21:34:11 +0000 (23:34 +0200)
Introduce string_is_C_identifier() and use it to enforce transport
names according to the 180 spec.

src/common/util.c
src/common/util.h
src/or/config.c
src/or/transports.c

index 63172c36a3d5a5682d98c59a0c8240103285b332..5fc2cbeabc49156f6da548c400a691bdbe9b1f1e 100644 (file)
@@ -719,6 +719,34 @@ find_str_at_start_of_line(const char *haystack, const char *needle)
   return NULL;
 }
 
+/** Returns true if <b>string</b> could be a C identifier.
+    A C identifier must begin with a letter or an underscore and the
+    rest of its characters can be letters, numbers or underscores. No
+    length limit is imposed. */
+int
+string_is_C_identifier(const char *string)
+{
+  size_t iter;
+  size_t length = strlen(string);
+  if (!length)
+    return 0;
+
+  for (iter = 0; iter < length ; iter++) {
+    if (iter == 0) {
+      if (!(TOR_ISALPHA(string[iter]) ||
+            string[iter] == '_'))
+        return 0;
+    } else {
+      if (!(TOR_ISALPHA(string[iter]) ||
+            TOR_ISDIGIT(string[iter]) ||
+            string[iter] == '_'))
+        return 0;
+    }
+  }
+
+  return 1;
+}
+
 /** Return true iff the 'len' bytes at 'mem' are all zero. */
 int
 tor_mem_is_zero(const char *mem, size_t len)
index 7e889b10c7bd62ddc187a0f222840dc08947147f..04ae7cbc336fc20802d0dc6e7bd1cbe955767557 100644 (file)
@@ -203,6 +203,8 @@ const char *find_whitespace(const char *s) ATTR_PURE;
 const char *find_whitespace_eos(const char *s, const char *eos) ATTR_PURE;
 const char *find_str_at_start_of_line(const char *haystack, const char *needle)
   ATTR_PURE;
+int string_is_C_identifier(const char *string);
+
 int tor_mem_is_zero(const char *mem, size_t len) ATTR_PURE;
 int tor_digest_is_zero(const char *digest) ATTR_PURE;
 int tor_digest256_is_zero(const char *digest) ATTR_PURE;
index d36418b0d5924802df21f44ef6592069755574eb..58668b1734d7a2dee35bf9fa5a6a74ef6c805c2e 100644 (file)
@@ -4724,6 +4724,10 @@ parse_client_transport_line(const char *line, int validate_only)
   }
 
   name = smartlist_get(items, 0);
+  if (!string_is_C_identifier(name)) {
+    log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).", name);
+    goto err;
+  }
 
   /* field2 is either a SOCKS version or "exec" */
   field2 = smartlist_get(items, 1);
@@ -4826,6 +4830,10 @@ parse_server_transport_line(const char *line, int validate_only)
   }
 
   name = smartlist_get(items, 0);
+  if (!string_is_C_identifier(name)) {
+    log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).", name);
+    goto err;
+  }
 
   type = smartlist_get(items, 1);
 
index 1b7249fae259605f0d9e3188c531d178d64f7af5..6d1ddebe5d357d7229e98a3ac38f2f7782d3e436 100644 (file)
@@ -686,6 +686,11 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
   tor_assert(!strcmp(smartlist_get(items,0),PROTO_SMETHOD));
 
   method_name = smartlist_get(items,1);
+  if (!string_is_C_identifier(method_name)) {
+    log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).",
+             method_name);
+    goto err;
+  }
 
   addrport = smartlist_get(items, 2);
   if (tor_addr_port_parse(addrport, &addr, &port)<0) {
@@ -754,6 +759,11 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
   tor_assert(!strcmp(smartlist_get(items,0),PROTO_CMETHOD));
 
   method_name = smartlist_get(items,1);
+  if (!string_is_C_identifier(method_name)) {
+    log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).",
+             method_name);
+    goto err;
+  }
 
   socks_ver_str = smartlist_get(items,2);