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 req. + * 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 conn 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 **************************/