[tor-commits] [tor-browser-bundle/master] Bug #11069: Detect PT bootstrap failures.

mikeperry at torproject.org mikeperry at torproject.org
Fri Mar 7 07:24:17 UTC 2014


commit bfb553da6b2d1978c369361950079297a8628fbf
Author: Mike Perry <mikeperry-git at torproject.org>
Date:   Thu Mar 6 17:05:04 2014 -0800

    Bug #11069: Detect PT bootstrap failures.
---
 gitian/descriptors/linux/gitian-tor.yml   |    4 +
 gitian/descriptors/mac/gitian-tor.yml     |    4 +
 gitian/descriptors/windows/gitian-tor.yml |    4 +
 gitian/patches/bug11069.patch             |  169 +++++++++++++++++++++++++++++
 4 files changed, 181 insertions(+)

diff --git a/gitian/descriptors/linux/gitian-tor.yml b/gitian/descriptors/linux/gitian-tor.yml
index ce9372b..8a50ed4 100644
--- a/gitian/descriptors/linux/gitian-tor.yml
+++ b/gitian/descriptors/linux/gitian-tor.yml
@@ -26,6 +26,7 @@ files:
 - "versions"
 - "bug10297.patch"
 - "bug5018.patch"
+- "bug11069.patch"
 - "dzip.sh"
 - "openssl.tar.gz"
 script: |
@@ -81,6 +82,9 @@ script: |
     git am ~/build/bug10297.patch
     git am ~/build/bug5018.patch
   fi
+  if [ $BUILD_PT_BUNDLES ]; then
+    git am ~/build/bug11069.patch
+  fi
   mkdir -p $OUTDIR/src
   #git archive HEAD | tar -x -C $OUTDIR/src
   ./autogen.sh
diff --git a/gitian/descriptors/mac/gitian-tor.yml b/gitian/descriptors/mac/gitian-tor.yml
index c2c2bf6..d2aab2f 100644
--- a/gitian/descriptors/mac/gitian-tor.yml
+++ b/gitian/descriptors/mac/gitian-tor.yml
@@ -27,6 +27,7 @@ files:
 - "openssl.tar.gz"
 - "bug10297.patch"
 - "bug5018.patch"
+- "bug11069.patch"
 - "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
 - "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
 - "dzip.sh"
@@ -97,6 +98,9 @@ script: |
     git am ~/build/bug10297.patch
     git am ~/build/bug5018.patch
   fi
+  if [ $BUILD_PT_BUNDLES ]; then
+    git am ~/build/bug11069.patch
+  fi
   mkdir -p $OUTDIR/src
   git archive HEAD | tar -x -C $OUTDIR/src
   ./autogen.sh
diff --git a/gitian/descriptors/windows/gitian-tor.yml b/gitian/descriptors/windows/gitian-tor.yml
index 6900a14..00b1f9a 100644
--- a/gitian/descriptors/windows/gitian-tor.yml
+++ b/gitian/descriptors/windows/gitian-tor.yml
@@ -26,6 +26,7 @@ files:
 - "versions"
 - "bug10297.patch"
 - "bug5018.patch"
+- "bug11069.patch"
 - "binutils.tar.bz2"
 - "dzip.sh"
 - "openssl.tar.gz"
@@ -93,6 +94,9 @@ script: |
     git am ~/build/bug10297.patch
     git am ~/build/bug5018.patch
   fi
+  if [ $BUILD_PT_BUNDLES ]; then
+    git am ~/build/bug11069.patch
+  fi
   mkdir -p $OUTDIR/src
   git archive HEAD | tar -x -C $OUTDIR/src
   ./autogen.sh
diff --git a/gitian/patches/bug11069.patch b/gitian/patches/bug11069.patch
new file mode 100644
index 0000000..563aafb
--- /dev/null
+++ b/gitian/patches/bug11069.patch
@@ -0,0 +1,169 @@
+From 404cc6095e31ce47af9287cdda1e4d3ff449b387 Mon Sep 17 00:00:00 2001
+From: George Kadianakis <desnacked at riseup.net>
+Date: Fri, 28 Feb 2014 15:19:30 +0000
+Subject: [PATCH] Throw control port warning if we failed connecting to briges.
+
+---
+ changes/bug11069    |  4 ++++
+ src/or/connection.c | 41 ++++++++++++++++++++++++++++++++---------
+ src/or/connection.h |  2 ++
+ src/or/control.c    |  7 ++++---
+ src/or/entrynodes.c | 21 ---------------------
+ src/or/entrynodes.h |  1 -
+ 6 files changed, 42 insertions(+), 34 deletions(-)
+ create mode 100644 changes/bug11069
+
+diff --git a/changes/bug11069 b/changes/bug11069
+new file mode 100644
+index 0000000..5aa3085
+--- /dev/null
++++ b/changes/bug11069
+@@ -0,0 +1,4 @@
++  o Minor bugfixes (clients):
++    - Fix tor so that it raises a control port warning when we fail to
++      connect to all of our bridges. Fixes bug 11069; bugfix on
++      tor-0.2.1.2-alpha.
+diff --git a/src/or/connection.c b/src/or/connection.c
+index 77565ee..12f2b01 100644
+--- a/src/or/connection.c
++++ b/src/or/connection.c
+@@ -3129,15 +3129,6 @@ connection_handle_read_impl(connection_t *conn)
+   before = buf_datalen(conn->inbuf);
+   if (connection_read_to_buf(conn, &max_to_read, &socket_error) < 0) {
+     /* There's a read error; kill the connection.*/
+-    if (conn->type == CONN_TYPE_OR) {
+-      connection_or_notify_error(TO_OR_CONN(conn),
+-                                 socket_error != 0 ?
+-                                   errno_to_orconn_end_reason(socket_error) :
+-                                   END_OR_CONN_REASON_CONNRESET,
+-                                 socket_error != 0 ?
+-                                   tor_socket_strerror(socket_error) :
+-                                   "(unknown, errno was 0)");
+-    }
+     if (CONN_IS_EDGE(conn)) {
+       edge_connection_t *edge_conn = TO_EDGE_CONN(conn);
+       connection_edge_end_errno(edge_conn);
+@@ -3152,6 +3143,19 @@ connection_handle_read_impl(connection_t *conn)
+      * connection_or_notify_error() above.
+      */
+     connection_mark_for_close_internal(conn);
++
++    /* If it's an OR connection, notify the other components of its
++       failure. */
++    if (conn->type == CONN_TYPE_OR) {
++      connection_or_notify_error(TO_OR_CONN(conn),
++                                 socket_error != 0 ?
++                                   errno_to_orconn_end_reason(socket_error) :
++                                   END_OR_CONN_REASON_CONNRESET,
++                                 socket_error != 0 ?
++                                   tor_socket_strerror(socket_error) :
++                                   "(unknown, errno was 0)");
++    }
++
+     return -1;
+   }
+   n_read += buf_datalen(conn->inbuf) - before;
+@@ -4164,6 +4168,25 @@ connection_dir_get_by_purpose_and_resource(int purpose,
+   return NULL;
+ }
+ 
++/** Return 1 if there are any active OR connections. We use this to
++ * guess if we should tell the controller that we didn't manage to
++ * connect to any of our bridges. */
++int
++any_active_or_conns(void)
++{
++  smartlist_t *conns = get_connection_array();
++  SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) {
++    if (conn->type == CONN_TYPE_OR &&
++        !conn->marked_for_close) {
++      log_debug(LD_DIR, "%s: Found an OR connection: %s",
++                __func__, conn->address);
++      return 1;
++    }
++  } SMARTLIST_FOREACH_END(conn);
++
++  return 0;
++}
++
+ /** Return 1 if <b>conn</b> is a listener conn, else return 0. */
+ int
+ connection_is_listener(connection_t *conn)
+diff --git a/src/or/connection.h b/src/or/connection.h
+index fa07650..47c70c5 100644
+--- a/src/or/connection.h
++++ b/src/or/connection.h
+@@ -187,6 +187,8 @@ connection_t *connection_get_by_type_state_rendquery(int type, int state,
+ dir_connection_t *connection_dir_get_by_purpose_and_resource(
+                                            int state, const char *resource);
+ 
++int any_active_or_conns(void);
++
+ #define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR)
+ int connection_is_listener(connection_t *conn);
+ int connection_state_is_open(connection_t *conn);
+diff --git a/src/or/control.c b/src/or/control.c
+index 05ff9a6..198fb18 100644
+--- a/src/or/control.c
++++ b/src/or/control.c
+@@ -4898,9 +4898,10 @@ control_event_bootstrap_problem, (const char *warn, int reason))
+   if (reason == END_OR_CONN_REASON_NO_ROUTE)
+     recommendation = "warn";
+ 
+-  if (get_options()->UseBridges &&
+-      !any_bridge_descriptors_known() &&
+-      !any_pending_bridge_descriptor_fetches())
++  /* If we are using bridges and all our OR connections are now
++     closed, it means that we totally failed to connect to our
++     bridges. Throw a warning. */
++  if (get_options()->UseBridges && !any_active_or_conns())
+     recommendation = "warn";
+ 
+   if (we_are_hibernating())
+diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c
+index d463303..17c5b13 100644
+--- a/src/or/entrynodes.c
++++ b/src/or/entrynodes.c
+@@ -2213,27 +2213,6 @@ any_bridge_descriptors_known(void)
+   return choose_random_entry(NULL) != NULL;
+ }
+ 
+-/** Return 1 if there are any directory conns fetching bridge descriptors
+- * that aren't marked for close. We use this to guess if we should tell
+- * the controller that we have a problem. */
+-int
+-any_pending_bridge_descriptor_fetches(void)
+-{
+-  smartlist_t *conns = get_connection_array();
+-  SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) {
+-    if (conn->type == CONN_TYPE_DIR &&
+-        conn->purpose == DIR_PURPOSE_FETCH_SERVERDESC &&
+-        TO_DIR_CONN(conn)->router_purpose == ROUTER_PURPOSE_BRIDGE &&
+-        !conn->marked_for_close &&
+-        conn->linked &&
+-        conn->linked_conn && !conn->linked_conn->marked_for_close) {
+-      log_debug(LD_DIR, "found one: %s", conn->address);
+-      return 1;
+-    }
+-  } SMARTLIST_FOREACH_END(conn);
+-  return 0;
+-}
+-
+ /** Return 1 if we have at least one descriptor for an entry guard
+  * (bridge or member of EntryNodes) and all descriptors we know are
+  * down. Else return 0. If <b>act</b> is 1, then mark the down guards
+diff --git a/src/or/entrynodes.h b/src/or/entrynodes.h
+index 772c666..73ac017 100644
+--- a/src/or/entrynodes.h
++++ b/src/or/entrynodes.h
+@@ -105,7 +105,6 @@ void retry_bridge_descriptor_fetch_directly(const char *digest);
+ void fetch_bridge_descriptors(const or_options_t *options, time_t now);
+ void learned_bridge_descriptor(routerinfo_t *ri, int from_cache);
+ int any_bridge_descriptors_known(void);
+-int any_pending_bridge_descriptor_fetches(void);
+ int entries_known_but_down(const or_options_t *options);
+ void entries_retry_all(const or_options_t *options);
+ 
+-- 
+1.8.1.2
+





More information about the tor-commits mailing list