[tor-commits] [tor/master] hs-v3: Set extended error when descriptor is not found

asn at torproject.org asn at torproject.org
Mon Nov 18 17:12:15 UTC 2019


commit fb1d2120212bef100f2b5e90d27b8c251280cb0c
Author: David Goulet <dgoulet at torproject.org>
Date:   Tue May 28 13:36:34 2019 -0400

    hs-v3: Set extended error when descriptor is not found
    
    Part of #30382
    
    Signed-off-by: David Goulet <dgoulet at torproject.org>
---
 src/feature/dirclient/dirclient.c |  1 +
 src/feature/hs/hs_client.c        | 24 ++++++++++++++++++++++++
 src/feature/hs/hs_client.h        |  1 +
 3 files changed, 26 insertions(+)

diff --git a/src/feature/dirclient/dirclient.c b/src/feature/dirclient/dirclient.c
index 3b506317b..64205a44e 100644
--- a/src/feature/dirclient/dirclient.c
+++ b/src/feature/dirclient/dirclient.c
@@ -2761,6 +2761,7 @@ handle_response_fetch_hsdesc_v3(dir_connection_t *conn,
                                  "NOT_FOUND");
     hs_control_desc_event_content(conn->hs_ident, conn->identity_digest,
                                   NULL);
+    hs_client_desc_not_found(conn->hs_ident);
     break;
   case 400:
     log_warn(LD_REND, "Fetching v3 hidden service descriptor failed: "
diff --git a/src/feature/hs/hs_client.c b/src/feature/hs/hs_client.c
index 491c52a04..0e4df73b9 100644
--- a/src/feature/hs/hs_client.c
+++ b/src/feature/hs/hs_client.c
@@ -42,6 +42,7 @@
 #include "core/or/entry_connection_st.h"
 #include "core/or/extend_info_st.h"
 #include "core/or/origin_circuit_st.h"
+#include "core/or/socks_request_st.h"
 
 /** Client-side authorizations for hidden services; map of service identity
  * public key to hs_client_service_authorization_t *. */
@@ -1758,6 +1759,29 @@ hs_client_desc_has_arrived(const hs_ident_dir_conn_t *ident)
   smartlist_free(entry_conns);
 }
 
+/** This is called when a descriptor fetch was not found. Every entry
+ * connection that matches the requested onion service, its extended error
+ * code will be set accordingly. */
+void
+hs_client_desc_not_found(const hs_ident_dir_conn_t *ident)
+{
+  smartlist_t *entry_conns;
+
+  tor_assert(ident);
+
+  entry_conns = find_entry_conns(&ident->identity_pk);
+
+  SMARTLIST_FOREACH_BEGIN(entry_conns, entry_connection_t *, entry_conn) {
+    /* Descriptor was not found. We'll flag the socks request with the
+     * extended error code. If it is supported, it will be sent back. */
+    entry_conn->socks_request->socks_extended_error_code =
+      SOCKS5_HS_NOT_FOUND;
+  } SMARTLIST_FOREACH_END(entry_conn);
+
+  /* We don't have ownership of the objects in this list. */
+  smartlist_free(entry_conns);
+}
+
 /** Return a newly allocated extend_info_t for a randomly chosen introduction
  * point for the given edge connection identifier ident. Return NULL if we
  * can't pick any usable introduction points. */
diff --git a/src/feature/hs/hs_client.h b/src/feature/hs/hs_client.h
index 0e22a2e04..6bd6e5748 100644
--- a/src/feature/hs/hs_client.h
+++ b/src/feature/hs/hs_client.h
@@ -73,6 +73,7 @@ int hs_client_receive_rendezvous2(origin_circuit_t *circ,
                                   size_t payload_len);
 
 void hs_client_desc_has_arrived(const hs_ident_dir_conn_t *ident);
+void hs_client_desc_not_found(const hs_ident_dir_conn_t *ident);
 
 extend_info_t *hs_client_get_random_intro_from_edge(
                                           const edge_connection_t *edge_conn);





More information about the tor-commits mailing list