[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[tor-bugs] #21450 [Core Tor/Tor]: Consistently parse tor versions regardless of word size



#21450: Consistently parse tor versions regardless of word size
------------------------------+--------------------------------
     Reporter:  teor          |      Owner:
         Type:  defect        |     Status:  new
     Priority:  Medium        |  Milestone:  Tor: 0.3.0.x-final
    Component:  Core Tor/Tor  |    Version:
     Severity:  Normal        |   Keywords:
Actual Points:                |  Parent ID:
       Points:  0.5           |   Reviewer:
      Sponsor:                |
------------------------------+--------------------------------
 We use strtol() in tor_version_parse(), but longs are different sizes on
 32-bit and 64-bit.

 Casting long to int means that some versions that look different on 64-bit
 platforms could be truncated and look the same on 32-bit platforms. And
 some versions that parse on 64-bit platforms fail to parse on 32-bit
 platforms (particularly after #21278, because the cast makes some of them
 negative).

 This fix does not need a new consensus method, because we reject router
 descriptors with version components that don't parse in #21278.

 Here's my patch:
 {{{
 diff --git a/src/or/routerparse.c b/src/or/routerparse.c
 index 58b9a22438..9d8ef11ac7 100644
 --- a/src/or/routerparse.c
 +++ b/src/or/routerparse.c
 @@ -4840,6 +4840,7 @@ tor_version_parse(const char *s, tor_version_t *out)
  {
    char *eos=NULL;
    const char *cp=NULL;
 +  int ok = 1;
    /* Format is:
     *   "Tor " ? NUM dot NUM [ dot NUM [ ( pre | rc | dot ) NUM ] ] [ -
 tag ]
     */
 @@ -4855,7 +4856,9 @@ tor_version_parse(const char *s, tor_version_t *out)

  #define NUMBER(m)                               \
    do {                                          \
 -    out->m = (int)strtol(cp, &eos, 10);         \
 +    out->m = (int)tor_parse_uint64(val, 10, 0, INT32_MAX, &ok, &eos); \
 +    if (!ok)                                    \
 +      return -1;                                \
      if (!eos || eos == cp)                      \
        return -1;                                \
      cp = eos;                                   \
 }}}

 This might also need a torspec patch saying that INT_MAX is the limit, or
 that implementations can place limits on version numbers.

--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/21450>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online
_______________________________________________
tor-bugs mailing list
tor-bugs@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-bugs