[tor-bugs] #20218 [Core Tor/Tor]: Fix and refactor and redocument routerstatus_has_changed

Tor Bug Tracker & Wiki blackhole at torproject.org
Thu Feb 8 23:49:47 UTC 2018


#20218: Fix and refactor and redocument routerstatus_has_changed
-------------------------------------------------+-------------------------
 Reporter:  nickm                                |          Owner:  (none)
     Type:  defect                               |         Status:
                                                 |  needs_revision
 Priority:  Medium                               |      Milestone:  Tor:
                                                 |  0.3.4.x-final
Component:  Core Tor/Tor                         |        Version:
 Severity:  Normal                               |     Resolution:
 Keywords:  ipv6, 029-proposed, tor-control,     |  Actual Points:  0.5
  easy, spec-conformance, review-group-31        |
Parent ID:                                       |         Points:  .1
 Reviewer:  nickm                                |        Sponsor:
-------------------------------------------------+-------------------------

Comment (by teor):

 Replying to [comment:31 nickm]:
 > teor, I think you have tor_addr_compare backwards. Its documentation
 says:
 > {{{
 >  * Given two addresses <b>addr1</b> and <b>addr2</b>, return 0 if the
 two
 >  * addresses are equivalent under the mask mbits, less than 0 if addr1
 >  * precedes addr2, and greater than 0 otherwise.
 > }}}
 >
 > So the original use of tor_addr_compare (without "!") is correct.

 You're right. Oops!

 > (Unit tests would have caught this bug; that's one reason why unit tests
 are so great. ;) Any chance of writing those?)

 I think we should have unit tests.

 > As a smaller issue, it seems that this patch says the same line twice:
 > {{{
 >          a->is_hs_dir != b->is_hs_dir ||
 >          a->is_hs_dir != b->is_hs_dir ||
 > }}}
 >
 > ---
 > Another question: how did you decide on the list of fields to check?  It
 seems that some but not all of the fields in routerstatus_t are now
 checked for equality, but I don't understand the rationale about why the
 remaining ones (pv, exitsummary) are not.  Is that intentional?

 We only check the fields that are output via the control port.
 We should revise this like to say "only" not "also":
 {{{
 /* Given two router status entries for the same router identity, return 1
 if
  * if the contents have changed between them. Otherwise, return 0.
  * It also checks for changes for that are output by control port. */
 }}}

 https://github.com/ArunaMaurya221B/tor/commit/e29292dda5ef68e441f267864357a7568b29588e
 #diff-fcb162b79906521706b54d280b939d57R1540

 > ---
 >
 > Teor asks:
 > >  How can we make sure we update functions when we add new members to a
 struct?
 >
 > In some cases, using a constructor for a struct instance will work,
 since we have turned on the options that let us know about any
 uninitialized members.  But in cases like this, I don't see an easy way to
 use a constructor.
 >
 > One option here would be to stop assuming that we list all relevant the
 members here.  We could instead change the code that we only list the
 ''irrelevant'' members, by:
 >   1. Making sure that when we construct routerstatus_t, we initialize
 the whole object to 0.
 >   2. In a function like this, using memcpy() to make a temporary copy of
 the routerstatus_t.
 >   3. Instead of listing all the relevant members in a comparison, we
 could just use fast_memeq() to compare.  If there are some members we
 don't want to compare, we would set them to 0 before calling fast_memeq().
 > I'm not sure if this is actually a good idea, though.

 I think it is enough to comment the control port printing function, and
 this function, and say that they must be kept in sync.

--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/20218#comment:32>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online


More information about the tor-bugs mailing list