From c11c48fc783305fbb3a1b446b35dc3d9602d4bbe Mon Sep 17 00:00:00 2001
From: Nick Mathewson <nickm@torproject.org>
Date: Tue, 5 Feb 2008 21:39:40 +0000
Subject: [PATCH]  r17913@catbus:  nickm | 2008-02-05 16:11:33 -0500  Correctly
 register failures in connection_add() in dnsserv_launch_request()

svn:r13387
---
 ChangeLog        |  9 +++++++++
 src/or/control.c | 15 +++++++++++----
 src/or/dnsserv.c | 10 ++++++----
 src/or/or.h      |  2 +-
 4 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ec656b9c8e..ebe5773f4a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,8 @@
 Changes in version 0.2.0.19-alpha - 2008-02-??
+  o Minor features:
+    - Actually validate the options passed to AuthDirReject, AuthDirInvalid,
+      AuthDirBadDir, and AuthDirBadExit.
+
   o Major bugfixes:
     - If we're a relay, avoid picking ourselves as an introduction point,
       a rendezvous point, or as the final hop for internal circuits. Bug
@@ -23,6 +27,11 @@ Changes in version 0.2.0.19-alpha - 2008-02-??
       signature download requests.  Fix for bug 593.  Bugfix on 0.2.0.x.
     - Don't trigger an assert if we start a directory authority with a
       private IP address (like 127.0.0.1).
+    - Avoid possible failures when generating a directory with routers with
+      over-long versions strings, or too many flags set.  Bugfix on 0.1.2.x.
+    - If an attempt to launch a DNS resolve request over the control
+      port fails because we have overrun the limit on the number of
+      connections, tell the controller that the request has failed.
 
 
 Changes in version 0.2.0.18-alpha - 2008-01-25
diff --git a/src/or/control.c b/src/or/control.c
index 31c88580df..afb88d2a9b 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -2439,7 +2439,7 @@ static int
 handle_control_resolve(control_connection_t *conn, uint32_t len,
                        const char *body)
 {
-  smartlist_t *args;
+  smartlist_t *args, *failed;
   int is_reverse = 0;
   (void) len; /* body is nul-terminated; it's safe to ignore the length */
 
@@ -2458,14 +2458,21 @@ handle_control_resolve(control_connection_t *conn, uint32_t len,
     tor_free(cp);
     is_reverse = 1;
   }
+  failed = smartlist_create();
   SMARTLIST_FOREACH(args, const char *, arg, {
-      dnsserv_launch_request(arg, is_reverse);
+      if (dnsserv_launch_request(arg, is_reverse)<0)
+        smartlist_add(failed, (char*)arg);
+  });
+
+  send_control_done(conn);
+  SMARTLIST_FOREACH(failed, const char *, arg, {
+      control_event_address_mapped(arg, arg, time(NULL),
+                                   "Unable to launch resolve request");
   });
 
   SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
   smartlist_free(args);
-
-  send_control_done(conn);
+  smartlist_free(failed);
   return 0;
 }
 
diff --git a/src/or/dnsserv.c b/src/or/dnsserv.c
index d1e6219a94..d2b5bacc79 100644
--- a/src/or/dnsserv.c
+++ b/src/or/dnsserv.c
@@ -47,7 +47,7 @@ evdns_server_callback(struct evdns_server_request *req, void *_data)
   (void) addrlen;
   sa = (struct sockaddr*) &addr;
   if (sa->sa_family != AF_INET) {
-    /* XXXX020 Handle IPV6 */
+    /* XXXX_IP6 Handle IPV6 */
     log_warn(LD_APP, "Requesting address wasn't ipv4.");
     evdns_server_request_respond(req, DNS_ERR_SERVERFAILED);
     return;
@@ -155,8 +155,10 @@ evdns_server_callback(struct evdns_server_request *req, void *_data)
 
 /* Helper function: called whenever the client sends a resolve request to our
  * controller.  We need to eventually answer the request <b>req</b>.
+ * Returns 0 if the controller will be getting (or has gotten) an event in
+ * response; -1 if we couldn't launch the request.
  */
-void
+int
 dnsserv_launch_request(const char *name, int reverse)
 {
   edge_connection_t *conn;
@@ -178,9 +180,8 @@ dnsserv_launch_request(const char *name, int reverse)
 
   if (connection_add(TO_CONN(conn))<0) {
     log_warn(LD_APP, "Couldn't register dummy connection for RESOLVE request");
-    /* XXXX020 Answer the controller. */
     connection_free(TO_CONN(conn));
-    return;
+    return -1;
   }
 
   /* Now, throw the connection over to get rewritten (which will answer it
@@ -195,6 +196,7 @@ dnsserv_launch_request(const char *name, int reverse)
   log_info(LD_APP, "Passed request for %s to rewrite_and_attach.",
            escaped_safe_str(q_name));
   tor_free(q_name);
+  return 0;
 }
 
 /** If there is a pending request on <b>conn</b> that's waiting for an answer,
diff --git a/src/or/or.h b/src/or/or.h
index a1aea43901..eca2c8da64 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -3221,7 +3221,7 @@ void dnsserv_resolved(edge_connection_t *conn,
                       const char *answer,
                       int ttl);
 void dnsserv_reject_request(edge_connection_t *conn);
-void dnsserv_launch_request(const char *name, int is_reverse);
+int dnsserv_launch_request(const char *name, int is_reverse);
 
 /********************************* geoip.c **************************/
 
-- 
GitLab