Browse Source

Finally fix the bug where dynamic-IP relays disappear when their
IP address changes: directory mirrors were mistakenly telling them
their old address if they asked via begin_dir, so they never got
an accurate answer about their new address, so they just vanished
after a day. Should fix bugs 827, 883, and 900 -- but alas, only
after every directory mirror has upgraded.


svn:r19291

Roger Dingledine 16 years ago
parent
commit
8d82583d97
2 changed files with 15 additions and 7 deletions
  1. 9 5
      ChangeLog
  2. 6 2
      src/or/connection_edge.c

+ 9 - 5
ChangeLog

@@ -1,21 +1,25 @@
 Changes in version 0.2.1.14-rc - 2009-04-11
 Changes in version 0.2.1.14-rc - 2009-04-11
-  o Security fixes:
-    - Avoid crashing in the presence of certain malformed descriptors.
-      Found by lark, and by automated fuzzing.
-
   o Major features:
   o Major features:
     - Clients replace entry guards that were chosen more than a few months
     - Clients replace entry guards that were chosen more than a few months
       ago. This change should significantly improve client performance,
       ago. This change should significantly improve client performance,
       especially once more people upgrade, since relays that have been
       especially once more people upgrade, since relays that have been
       a guard for a long time are currently overloaded.
       a guard for a long time are currently overloaded.
 
 
-  o Major bugfixes:
+  o Major bugfixes (on 0.2.0):
+    - Finally fix the bug where dynamic-IP relays disappear when their
+      IP address changes: directory mirrors were mistakenly telling them
+      their old address if they asked via begin_dir, so they never got
+      an accurate answer about their new address, so they just vanished
+      after a day. Should fix bugs 827, 883, and 900 -- but alas, only
+      after every directory mirror has upgraded.
     - Relays were falling out of the networkstatus consensus for
     - Relays were falling out of the networkstatus consensus for
       part of a day if they changed their local config but the
       part of a day if they changed their local config but the
       authorities discarded their new descriptor as "not sufficiently
       authorities discarded their new descriptor as "not sufficiently
       different". Now directory authorities accept a descriptor as changed
       different". Now directory authorities accept a descriptor as changed
       if bandwidthrate or bandwidthburst changed. Partial fix for bug 962;
       if bandwidthrate or bandwidthburst changed. Partial fix for bug 962;
       patch by Sebastian.
       patch by Sebastian.
+    - Avoid crashing in the presence of certain malformed descriptors.
+      Found by lark, and by automated fuzzing.
 
 
   o Minor features:
   o Minor features:
     - When generating circuit events with verbose nicknames for
     - When generating circuit events with verbose nicknames for

+ 6 - 2
src/or/connection_edge.c

@@ -2547,8 +2547,12 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ)
                                     END_STREAM_REASON_NOTDIRECTORY, NULL);
                                     END_STREAM_REASON_NOTDIRECTORY, NULL);
       return 0;
       return 0;
     }
     }
-    if (or_circ && or_circ->p_conn && or_circ->p_conn->_base.address)
-      address = tor_strdup(or_circ->p_conn->_base.address);
+    /* Make sure to get the 'real' address of the previous hop: the
+     * caller might want to know whether his IP address has changed, and
+     * we might already have corrected _base.addr[ess] for the relay's
+     * canonical IP address. */
+    if (or_circ && or_circ->p_conn)
+      address = tor_dup_addr(&or_circ->p_conn->real_addr);
     else
     else
       address = tor_strdup("127.0.0.1");
       address = tor_strdup("127.0.0.1");
     port = 1; /* XXXX This value is never actually used anywhere, and there
     port = 1; /* XXXX This value is never actually used anywhere, and there