aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2021-01-21 13:19:49 -0500
committerNick Mathewson <nickm@torproject.org>2021-01-21 13:19:49 -0500
commit2243fc3ad1bb33ca5f4a37952bb474d8314d5325 (patch)
tree92a41ba6c4b83e0256c079ba3b043eba02fe1c85 /src
parent8a2786072008f18ccd5bace4f014057d06345af0 (diff)
parent71fd30b75ad028dfce69563792547f06fdf9d3c2 (diff)
downloadtor-2243fc3ad1bb33ca5f4a37952bb474d8314d5325.tar.gz
tor-2243fc3ad1bb33ca5f4a37952bb474d8314d5325.zip
Merge branch 'maint-0.4.5'
Diffstat (limited to 'src')
-rw-r--r--src/app/config/config.c17
-rw-r--r--src/feature/client/bridges.c20
-rw-r--r--src/feature/client/bridges.h1
-rw-r--r--src/feature/client/entrynodes.c3
4 files changed, 24 insertions, 17 deletions
diff --git a/src/app/config/config.c b/src/app/config/config.c
index 4c0c57af47..b5be148895 100644
--- a/src/app/config/config.c
+++ b/src/app/config/config.c
@@ -2189,23 +2189,6 @@ options_act,(const or_options_t *old_options))
}
}
- /* Validate that we actually have a configured transport for a Bridge line
- * that has one. This is done here because we require the bridge and
- * transport to be added to the global list before doing the validation.
- *
- * In an ideal world, pt_parse_transport_line() would actually return a
- * transport_t object so we could inspect it and thus do this step at
- * validation time. */
- SMARTLIST_FOREACH_BEGIN(bridge_list_get(), const bridge_info_t *, bi) {
- const char *bi_transport_name = bridget_get_transport_name(bi);
- if (bi_transport_name && (!transport_get_by_name(bi_transport_name) &&
- !managed_proxy_has_transport(bi_transport_name))) {
- log_warn(LD_CONFIG, "Bridge line with transport %s is missing a "
- "ClientTransportPlugin line", bi_transport_name);
- return -1;
- }
- } SMARTLIST_FOREACH_END(bi);
-
if (options_act_server_transport(old_options) < 0)
return -1;
diff --git a/src/feature/client/bridges.c b/src/feature/client/bridges.c
index 8e2bb01661..96c3497c6f 100644
--- a/src/feature/client/bridges.c
+++ b/src/feature/client/bridges.c
@@ -175,6 +175,17 @@ bridget_get_transport_name(const bridge_info_t *bridge)
return bridge->transport_name;
}
+/**
+ * Return true if @a bridge has a transport name for which we don't actually
+ * know a transport.
+ */
+bool
+bridge_has_invalid_transport(const bridge_info_t *bridge)
+{
+ const char *tname = bridget_get_transport_name(bridge);
+ return tname && transport_get_by_name(tname) == NULL;
+}
+
/** If we have a bridge configured whose digest matches <b>digest</b>, or a
* bridge with no known digest whose address matches any of the
* tor_addr_port_t's in <b>orports</b>, return that bridge. Else return
@@ -656,6 +667,15 @@ launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge)
DIR_PURPOSE_FETCH_SERVERDESC))
return; /* it's already on the way */
+ if (bridge_has_invalid_transport(bridge)) {
+ download_status_mark_impossible(&bridge->fetch_status);
+ log_warn(LD_CONFIG, "Can't use bridge at %s: there is no configured "
+ "transport called \"%s\".",
+ safe_str_client(fmt_and_decorate_addr(&bridge->addr)),
+ bridget_get_transport_name(bridge));
+ return; /* Can't use this bridge; it has not */
+ }
+
if (routerset_contains_bridge(options->ExcludeNodes, bridge)) {
download_status_mark_impossible(&bridge->fetch_status);
log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.",
diff --git a/src/feature/client/bridges.h b/src/feature/client/bridges.h
index 1b090e8649..f5ecc1b76d 100644
--- a/src/feature/client/bridges.h
+++ b/src/feature/client/bridges.h
@@ -24,6 +24,7 @@ const smartlist_t *bridge_list_get(void);
const uint8_t *bridge_get_rsa_id_digest(const bridge_info_t *bridge);
const tor_addr_port_t * bridge_get_addr_port(const bridge_info_t *bridge);
const char *bridget_get_transport_name(const bridge_info_t *bridge);
+bool bridge_has_invalid_transport(const bridge_info_t *bridge);
bridge_info_t *get_configured_bridge_by_addr_port_digest(
const tor_addr_t *addr,
uint16_t port,
diff --git a/src/feature/client/entrynodes.c b/src/feature/client/entrynodes.c
index 409bed1a40..078024a9be 100644
--- a/src/feature/client/entrynodes.c
+++ b/src/feature/client/entrynodes.c
@@ -804,6 +804,9 @@ get_sampled_guard_for_bridge(guard_selection_t *gs,
entry_guard_t *guard;
if (BUG(!addrport))
return NULL; // LCOV_EXCL_LINE
+ if (bridge_has_invalid_transport(bridge)) {
+ return NULL;
+ }
guard = get_sampled_guard_by_bridge_addr(gs, addrport);
if (! guard || (id && tor_memneq(id, guard->identity, DIGEST_LEN)))
return NULL;