Browse Source

Apply patch from Geoff for bug 132. Clean it up a little to fix a memory leak and to avoid unnecessary parse/unparse code.

svn:r4188
Nick Mathewson 20 years ago
parent
commit
d0c0d6c86a
1 changed files with 23 additions and 5 deletions
  1. 23 5
      src/or/connection_edge.c

+ 23 - 5
src/or/connection_edge.c

@@ -912,16 +912,34 @@ static int connection_ap_handshake_process_socks(connection_t *conn) {
   addresstype = parse_extended_hostname(socks->address);
 
   if (addresstype == EXIT_HOSTNAME) {
-    /* .exit -- modify conn to specify the exit node. */
+    /* foo.exit -- modify conn->chosen_exit_node to specify the exit
+     * node, and conn->address to hold only the address portion.*/
     char *s = strrchr(socks->address,'.');
-    if (!s || s[1] == '\0') {
-      log_fn(LOG_WARN,"Malformed exit address '%s'. Refusing.",
+    if (s && s[1] != '\0') {
+      conn->chosen_exit_name = tor_strdup(s+1);
+      *s = 0;
+    } else if (s[1] == '\0') {
+      log_fn(LOG_WARN,"Malformed exit address '%s.exit'. Refusing.",
              safe_str(socks->address));
       connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
       return -1;
+    } else {
+      tor_assert(!s); /* address is of the form server.exit. */
+      struct in_addr in;
+      routerinfo_t *r = router_get_by_nickname(socks->address);
+      if (r) {
+        conn->chosen_exit_name = tor_strdup(socks->address);
+        /* XXXX Should this use server->address instead? */
+        in.s_addr = htonl(r->addr);
+        strlcpy(socks->address, inet_ntoa(in), sizeof(socks->address));
+      } else {
+        log_fn(LOG_WARN,
+               "Unrecognized server in exit address '%s.exit'. Refusing.",
+               safe_str(socks->address));
+        connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
+        return -1;
+      }
     }
-    conn->chosen_exit_name = tor_strdup(s+1);
-    *s = 0;
   }
 
   if (addresstype != ONION_HOSTNAME) {