Commit 582f2187 authored by Nick Mathewson's avatar Nick Mathewson 🦞
Browse files

Merge remote-tracking branch 'origin/maint-0.2.3'

parents a73dec16 1e68c213
Loading
Loading
Loading
Loading

changes/bug6827

0 → 100644
+9 −0
Original line number Diff line number Diff line
  o Minor bugfixes:

    - Avoid undefined behaviour when parsing the list of supported
      rendezvous/introduction protocols in a hidden service
      descriptor.  Previously, Tor would have confused (as-yet-unused)
      protocol version numbers greater than 32 with lower ones on many
      platforms.  Fixes bug 6827; bugfix on 0.2.0.10-alpha; found by
      George Kadianakis.
+5 −2
Original line number Diff line number Diff line
@@ -4292,14 +4292,17 @@ typedef struct rend_intro_point_t {
  time_t time_expiring;
} rend_intro_point_t;

#define REND_PROTOCOL_VERSION_BITMASK_WIDTH 16

/** Information used to connect to a hidden service.  Used on both the
 * service side and the client side. */
typedef struct rend_service_descriptor_t {
  crypto_pk_t *pk; /**< This service's public key. */
  int version; /**< Version of the descriptor format: 0 or 2. */
  time_t timestamp; /**< Time when the descriptor was generated. */
  uint16_t protocols; /**< Bitmask: which rendezvous protocols are supported?
  /** Bitmask: which rendezvous protocols are supported?
   * (We allow bits '0', '1', and '2' to be set.) */
  int protocols : REND_PROTOCOL_VERSION_BITMASK_WIDTH;
  /** List of the service's introduction points.  Elements are removed if
   * introduction attempts fail. */
  smartlist_t *intro_nodes;
+3 −0
Original line number Diff line number Diff line
@@ -4854,6 +4854,9 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out,
                                   10, 0, INT_MAX, &num_ok, NULL);
    if (!num_ok) /* It's a string; let's ignore it. */
      continue;
    if (version >= REND_PROTOCOL_VERSION_BITMASK_WIDTH)
      /* Avoid undefined left-shift behaviour. */
      continue;
    result->protocols |= 1 << version;
  }
  SMARTLIST_FOREACH(versions, char *, cp, tor_free(cp));