aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2012-09-13 10:08:51 -0400
committerNick Mathewson <nickm@torproject.org>2012-09-13 10:08:51 -0400
commit582f2187a769ea723f6bf13bc91f7a4b3c861408 (patch)
tree91633fb239242a25e8978452e39b39a39b8dfc37
parenta73dec16c539fd957ab09f242cd44b0a0858cd38 (diff)
parent1e68c213a24237b1733cfee3726aa646a805a5a9 (diff)
downloadtor-582f2187a769ea723f6bf13bc91f7a4b3c861408.tar
tor-582f2187a769ea723f6bf13bc91f7a4b3c861408.tar.gz
Merge remote-tracking branch 'origin/maint-0.2.3'
-rw-r--r--changes/bug68279
-rw-r--r--src/or/or.h7
-rw-r--r--src/or/routerparse.c3
3 files changed, 17 insertions, 2 deletions
diff --git a/changes/bug6827 b/changes/bug6827
new file mode 100644
index 000000000..bf71d2b97
--- /dev/null
+++ b/changes/bug6827
@@ -0,0 +1,9 @@
+ 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.
+
diff --git a/src/or/or.h b/src/or/or.h
index 788179bac..bb5482bf8 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -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?
- * (We allow bits '0', '1', and '2' to be set.) */
+ /** 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;
diff --git a/src/or/routerparse.c b/src/or/routerparse.c
index 6b94c6bfd..22f7d78d8 100644
--- a/src/or/routerparse.c
+++ b/src/or/routerparse.c
@@ -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));