Browse Source

prop224: Pick the right hsdir index based on descriptor.

There was a bug in upload_descriptor_to_all() where we picked between
first and second hsdir index based on which time segment we are. That's
not right and instead we should be uploading our two descriptors using a
different hsdir index every time. That is, upload first descriptor using
first hsdir index, and upload second descriptor using second hdsir index.

Also simplify stuff in pick_hdsir_v3() since that's only used to fetch
descriptors and hence we can just always use the fetch hsdir index.
George Kadianakis 6 years ago
parent
commit
e0371935a1
3 changed files with 4 additions and 10 deletions
  1. 1 3
      src/or/hs_client.c
  2. 2 2
      src/or/hs_common.h
  3. 1 5
      src/or/hs_service.c

+ 1 - 3
src/or/hs_client.c

@@ -162,7 +162,6 @@ static routerstatus_t *
 pick_hsdir_v3(const ed25519_public_key_t *onion_identity_pk)
 {
   int retval;
-  unsigned int is_new_tp = 0;
   char base64_blinded_pubkey[ED25519_BASE64_LEN + 1];
   uint64_t current_time_period = hs_get_time_period_num(0);
   smartlist_t *responsible_hsdirs;
@@ -183,9 +182,8 @@ pick_hsdir_v3(const ed25519_public_key_t *onion_identity_pk)
   }
 
   /* Get responsible hsdirs of service for this time period */
-  is_new_tp = hs_in_period_between_tp_and_srv(NULL, time(NULL));
   hs_get_responsible_hsdirs(&blinded_pubkey, current_time_period,
-                            is_new_tp, 1, responsible_hsdirs);
+                            0, 1, responsible_hsdirs);
 
   log_debug(LD_REND, "Found %d responsible HSDirs and about to pick one.",
            smartlist_len(responsible_hsdirs));

+ 2 - 2
src/or/hs_common.h

@@ -146,8 +146,8 @@ typedef struct hsdir_index_t {
   uint8_t fetch[DIGEST256_LEN];
 
   /* HSDir index used by services to store their first and second
-   * descriptor. The first descriptor is the one that uses older TP and SRV
-   * values than the second one. */
+   * descriptor. The first descriptor is chronologically older than the second
+   * one and uses older TP and SRV values. */
   uint8_t store_first[DIGEST256_LEN];
   uint8_t store_second[DIGEST256_LEN];
 } hsdir_index_t;

+ 1 - 5
src/or/hs_service.c

@@ -2382,21 +2382,17 @@ STATIC void
 upload_descriptor_to_all(const hs_service_t *service,
                          hs_service_descriptor_t *desc)
 {
-  unsigned int is_new_tp = 0;
   smartlist_t *responsible_dirs = NULL;
 
   tor_assert(service);
   tor_assert(desc);
 
-  /* Do we have a new TP that is are we between a new time period and the next
-   * SRV creation? */
-  is_new_tp = hs_in_period_between_tp_and_srv(NULL, approx_time());
   /* Get our list of responsible HSDir. */
   responsible_dirs = smartlist_new();
   /* The parameter 0 means that we aren't a client so tell the function to use
    * the spread store consensus paremeter. */
   hs_get_responsible_hsdirs(&desc->blinded_kp.pubkey, desc->time_period_num,
-                            is_new_tp, 0, responsible_dirs);
+                            service->desc_next == desc, 0, responsible_dirs);
 
   /** Clear list of previous hsdirs since we are about to upload to a new
    *  list. Let's keep it up to date. */