]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
prop250: Sort smartlist before you get most frequent SRV.
authorGeorge Kadianakis <desnacked@riseup.net>
Fri, 13 May 2016 17:42:33 +0000 (13:42 -0400)
committerDavid Goulet <dgoulet@torproject.org>
Fri, 1 Jul 2016 18:01:41 +0000 (14:01 -0400)
Signed-off-by: David Goulet <dgoulet@torproject.org>
src/or/shared_random.c
src/test/test_shared_random.c

index d409d109ac383ca3bd2c4df2bc293571acd44a9a..c5a62a754aee9c582b632d337bde183874d6a65e 100644 (file)
@@ -779,6 +779,15 @@ smartlist_get_most_frequent_srv(const smartlist_t *sl, int *count_out)
   return smartlist_get_most_frequent_(sl, compare_srvs_, count_out);
 }
 
+/** Compare two SRVs. Used in smartlist sorting. */
+static int
+compare_srv_(const void **_a, const void **_b)
+{
+  const sr_srv_t *a = *_a, *b = *_b;
+  return fast_memcmp(a->value, b->value,
+                     sizeof(a->value));
+}
+
 /* Using a list of <b>votes</b>, return the SRV object from them that has
  * been voted by the majority of dirauths. If <b>current</b> is set, we look
  * for the current SRV value else the previous one. The returned pointer is
@@ -813,6 +822,7 @@ get_majority_srv_from_votes(const smartlist_t *votes, int current)
     smartlist_add(srv_list, srv_tmp);
   } SMARTLIST_FOREACH_END(v);
 
+  smartlist_sort(srv_list, compare_srv_);
   most_frequent_srv = smartlist_get_most_frequent_srv(srv_list, &count);
   if (!most_frequent_srv) {
     goto end;
index fbb44145349c0ae229eb690480eeba66b1a434b6..5a9c123d2a28089b9bcb0b58f0c2d1651c429e43 100644 (file)
@@ -844,7 +844,7 @@ test_sr_get_majority_srv_from_votes(void *arg)
   { /* Now put in 8 more votes. Let SRV_1 have majority. */
     int i;
     /* Now 7 votes believe in SRV_1 */
-    for (i = 0; i < 6; i++) {
+    for (i = 0; i < 3; i++) {
       networkstatus_t *vote = get_test_vote_with_curr_srv(SRV_1);
       smartlist_add(votes, vote);
     }
@@ -853,6 +853,10 @@ test_sr_get_majority_srv_from_votes(void *arg)
       networkstatus_t *vote = get_test_vote_with_curr_srv(SRV_2);
       smartlist_add(votes, vote);
     }
+    for (i = 0; i < 3; i++) {
+      networkstatus_t *vote = get_test_vote_with_curr_srv(SRV_1);
+      smartlist_add(votes, vote);
+    }
 
     tt_int_op(smartlist_len(votes), ==, 9);
   }