Browse Source

Merge commit 'sebastian/misc-reason'

Nick Mathewson 13 years ago
parent
commit
9bcea4a8ef
6 changed files with 15 additions and 5 deletions
  1. 4 0
      changes/misc-reason
  2. 1 1
      doc/spec/control-spec.txt
  3. 2 3
      doc/spec/tor-spec.txt
  4. 1 1
      src/or/or.h
  5. 6 0
      src/or/reasons.c
  6. 1 0
      src/or/relay.c

+ 4 - 0
changes/misc-reason

@@ -0,0 +1,4 @@
+  o Minor bugfixes:
+    - Exit nodes didn't recognize EHOSTUNREACH as a stream ending reason
+      and sent back END_STREAM_REASON_NOROUTE. Also update the spec to
+      reflect this new reason. Bugfix on 0.1.0.1-rc; fixes bug 1793.

+ 1 - 1
doc/spec/control-spec.txt

@@ -1049,7 +1049,7 @@
 
       Reason = "MISC" / "RESOLVEFAILED" / "CONNECTREFUSED" /
                "EXITPOLICY" / "DESTROY" / "DONE" / "TIMEOUT" /
-               "HIBERNATING" / "INTERNAL"/ "RESOURCELIMIT" /
+               "NOROUTE" / "HIBERNATING" / "INTERNAL"/ "RESOURCELIMIT" /
                "CONNRESET" / "TORPROTOCOL" / "NOTDIRECTORY" / "END"
 
    The "REASON" field is provided only for FAILED, CLOSED, and DETACHED

+ 2 - 3
doc/spec/tor-spec.txt

@@ -835,7 +835,8 @@ see tor-design.pdf.
        6 -- REASON_DONE           (Anonymized TCP connection was closed)
        7 -- REASON_TIMEOUT        (Connection timed out, or OR timed out
                                    while connecting)
-       8 -- (unallocated) [**]
+       8 -- REASON_NOROUTE        (Routing error while attempting to
+                                   contact destination)
        9 -- REASON_HIBERNATING    (OR is temporarily hibernating)
       10 -- REASON_INTERNAL       (Internal error at the OR)
       11 -- REASON_RESOURCELIMIT  (OR has no resources to fulfill request)
@@ -857,8 +858,6 @@ see tor-design.pdf.
 
    [*] Older versions of Tor also send this reason when connections are
        reset.
-   [**] Due to a bug in versions of Tor through 0095, error reason 8 must
-        remain allocated until that version is obsolete.
 
    --- [The rest of this section describes unimplemented functionality.]
 

+ 1 - 1
src/or/or.h

@@ -551,7 +551,7 @@ typedef enum {
 #define END_STREAM_REASON_DESTROY 5
 #define END_STREAM_REASON_DONE 6
 #define END_STREAM_REASON_TIMEOUT 7
-/* 8 is unallocated for historical reasons. */
+#define END_STREAM_REASON_NOROUTE 8
 #define END_STREAM_REASON_HIBERNATING 9
 #define END_STREAM_REASON_INTERNAL 10
 #define END_STREAM_REASON_RESOURCELIMIT 11

+ 6 - 0
src/or/reasons.c

@@ -28,6 +28,7 @@ stream_end_reason_to_control_string(int reason)
     case END_STREAM_REASON_DESTROY: return "DESTROY";
     case END_STREAM_REASON_DONE: return "DONE";
     case END_STREAM_REASON_TIMEOUT: return "TIMEOUT";
+    case END_STREAM_REASON_NOROUTE: "return "NOROUTE";
     case END_STREAM_REASON_HIBERNATING: return "HIBERNATING";
     case END_STREAM_REASON_INTERNAL: return "INTERNAL";
     case END_STREAM_REASON_RESOURCELIMIT: return "RESOURCELIMIT";
@@ -62,6 +63,7 @@ stream_end_reason_to_string(int reason)
     case END_STREAM_REASON_DESTROY:        return "destroyed";
     case END_STREAM_REASON_DONE:           return "closed normally";
     case END_STREAM_REASON_TIMEOUT:        return "gave up (timeout)";
+    case END_STREAM_REASON_NOROUTE:        return "no route to host";
     case END_STREAM_REASON_HIBERNATING:    return "server is hibernating";
     case END_STREAM_REASON_INTERNAL:       return "internal error at server";
     case END_STREAM_REASON_RESOURCELIMIT:  return "server out of resources";
@@ -104,6 +106,8 @@ stream_end_reason_to_socks5_response(int reason)
       return SOCKS5_SUCCEEDED;
     case END_STREAM_REASON_TIMEOUT:
       return SOCKS5_TTL_EXPIRED;
+    case END_STREAM_REASON_NOROUTE:
+      return SOCKS5_HOST_UNREACHABLE;
     case END_STREAM_REASON_RESOURCELIMIT:
       return SOCKS5_GENERAL_ERROR;
     case END_STREAM_REASON_HIBERNATING:
@@ -164,6 +168,8 @@ errno_to_stream_end_reason(int e)
     S_CASE(ENOTCONN):
     S_CASE(ENETUNREACH):
       return END_STREAM_REASON_INTERNAL;
+    E_CASE(EHOSTUNREACH):
+      return END_STREAM_REASON_NOROUTE;
     S_CASE(ECONNREFUSED):
       return END_STREAM_REASON_CONNECTREFUSED;
     S_CASE(ECONNRESET):

+ 1 - 0
src/or/relay.c

@@ -787,6 +787,7 @@ connection_ap_process_end_not_open(
       case END_STREAM_REASON_RESOLVEFAILED:
       case END_STREAM_REASON_TIMEOUT:
       case END_STREAM_REASON_MISC:
+      case END_STREAM_REASON_NOROUTE:
         if (client_dns_incr_failures(conn->socks_request->address)
             < MAX_RESOLVE_FAILURES) {
           /* We haven't retried too many times; reattach the connection. */