[tor-commits] [tor/release-0.2.9] hs-v2: Copy needed information between service on prunning

teor at torproject.org teor at torproject.org
Fri Apr 19 02:01:35 UTC 2019


commit b4e44a371f077f5a9fca19f94e6ff5f604f3e9d3
Author: David Goulet <dgoulet at torproject.org>
Date:   Fri Mar 8 09:54:54 2019 -0500

    hs-v2: Copy needed information between service on prunning
    
    Turns out that when reloading a tor configured with hidden service(s), we
    weren't copying all the needed information between the old service object to
    the new one.
    
    For instance, the desc_is_dirty timestamp wasn't which could lead to the
    service uploading its descriptor much later than it would need to.
    
    The replaycache wasn't also moved over and some intro point information as
    well.
    
    Fixes #23790
    
    Signed-off-by: David Goulet <dgoulet at torproject.org>
---
 changes/bug23790     |  6 ++++++
 src/or/rendservice.c | 27 +++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/changes/bug23790 b/changes/bug23790
new file mode 100644
index 000000000..4aaf616e4
--- /dev/null
+++ b/changes/bug23790
@@ -0,0 +1,6 @@
+  o Minor bugfixes (hidden service v2):
+    - When reloading tor (HUP) configured with hidden service(s), some
+      information weren't copy to the new service object. One problem with this
+      was that tor would wait at least the RendPostPeriod time before uploading
+      the descriptor if the reload happened before the descriptor needed to be
+      published. Fixes bug 23790; bugfix on 0.2.1.9-alpha.
diff --git a/src/or/rendservice.c b/src/or/rendservice.c
index da200d138..32b856452 100644
--- a/src/or/rendservice.c
+++ b/src/or/rendservice.c
@@ -532,6 +532,30 @@ rend_service_check_dir_and_add(smartlist_t *service_list,
   }
 }
 
+/* Copy relevant data from service src to dst while pruning the service lists.
+ * This should only be called during the pruning process which takes existing
+ * services and copy their data to the newly configured services. The src
+ * service replaycache will be set to NULL after this call. */
+static void
+copy_service_on_prunning(rend_service_t *dst, rend_service_t *src)
+{
+  tor_assert(dst);
+  tor_assert(src);
+
+  /* Keep the timestamps for when the content changed and the next upload
+   * time so we can properly upload the descriptor if needed for the new
+   * service object. */
+  dst->desc_is_dirty = src->desc_is_dirty;
+  dst->next_upload_time = src->next_upload_time;
+  /* Move the replaycache to the new object. */
+  dst->accepted_intro_dh_parts = src->accepted_intro_dh_parts;
+  src->accepted_intro_dh_parts = NULL;
+  /* Copy intro point information to destination service. */
+  dst->intro_period_started = src->intro_period_started;
+  dst->n_intro_circuits_launched = src->n_intro_circuits_launched;
+  dst->n_intro_points_wanted = src->n_intro_points_wanted;
+}
+
 /** Set up rend_service_list, based on the values of HiddenServiceDir and
  * HiddenServicePort in <b>options</b>.  Return 0 on success and -1 on
  * failure.  (If <b>validate_only</b> is set, parse, warn and return as
@@ -812,6 +836,9 @@ rend_config_services(const or_options_t *options, int validate_only)
           smartlist_add_all(new->expiring_nodes, old->expiring_nodes);
           smartlist_clear(old->expiring_nodes);
           smartlist_add(surviving_services, old);
+
+          /* Copy service flags to the new service object. */
+          copy_service_on_prunning(new, old);
           break;
         }
       } SMARTLIST_FOREACH_END(old);





More information about the tor-commits mailing list