[tor-commits] [tor/release-0.2.5] Expand the event_mask field in controller conns to 64 bits
arma at torproject.org
arma at torproject.org
Tue Sep 9 11:18:27 UTC 2014
commit d229025fefa6faa228d9154e391293d9d5b320d3
Author: Nick Mathewson <nickm at torproject.org>
Date: Mon Sep 8 15:15:05 2014 -0400
Expand the event_mask field in controller conns to 64 bits
Back in 078d6bcd, we added an event number 0x20, but we didn't make
the event_mask field big enough to compensate.
Patch by "teor". Fixes 13085; bugfix on 0.2.5.1-alpha.
---
changes/bug13085 | 3 +++
src/or/control.c | 8 ++++----
src/or/control.h | 4 ++--
src/or/or.h | 5 +++--
4 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/changes/bug13085 b/changes/bug13085
new file mode 100644
index 0000000..a46457c
--- /dev/null
+++ b/changes/bug13085
@@ -0,0 +1,3 @@
+ o Minor bugfixes (controller):
+ - Actually send TRANSPORT_LAUNCHED and HS_DESC events to controllers.
+ Fixes bug 13085; bugfix on 0.2.5.1-alpha. Patch by "teor".
diff --git a/src/or/control.c b/src/or/control.c
index 4a6b18d..9378f38 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -582,7 +582,7 @@ send_control_event_string,(uint16_t event, event_format_t which,
conn->state == CONTROL_CONN_STATE_OPEN) {
control_connection_t *control_conn = TO_CONTROL_CONN(conn);
- if (control_conn->event_mask & (1<<event)) {
+ if (control_conn->event_mask & (((event_mask_t)1)<<event)) {
int is_err = 0;
connection_write_to_buf(msg, strlen(msg), TO_CONN(control_conn));
if (event == EVENT_ERR_MSG)
@@ -950,7 +950,7 @@ handle_control_setevents(control_connection_t *conn, uint32_t len,
const char *body)
{
int event_code = -1;
- uint32_t event_mask = 0;
+ event_mask_t event_mask = 0;
smartlist_t *events = smartlist_new();
(void) len;
@@ -978,7 +978,7 @@ handle_control_setevents(control_connection_t *conn, uint32_t len,
return 0;
}
}
- event_mask |= (1 << event_code);
+ event_mask |= (((event_mask_t)1) << event_code);
}
SMARTLIST_FOREACH_END(ev);
SMARTLIST_FOREACH(events, char *, e, tor_free(e));
@@ -2880,7 +2880,7 @@ handle_control_resolve(control_connection_t *conn, uint32_t len,
int is_reverse = 0;
(void) len; /* body is nul-terminated; it's safe to ignore the length */
- if (!(conn->event_mask & ((uint32_t)1L<<EVENT_ADDRMAP))) {
+ if (!(conn->event_mask & (((event_mask_t)1)<<EVENT_ADDRMAP))) {
log_warn(LD_CONTROL, "Controller asked us to resolve an address, but "
"isn't listening for ADDRMAP events. It probably won't see "
"the answer.");
diff --git a/src/or/control.h b/src/or/control.h
index 68a6c24..494f04b 100644
--- a/src/or/control.h
+++ b/src/or/control.h
@@ -156,8 +156,8 @@ void control_free_all(void);
#define EVENT_TRANSPORT_LAUNCHED 0x0020
#define EVENT_HS_DESC 0x0021
#define EVENT_MAX_ 0x0021
-/* If EVENT_MAX_ ever hits 0x0040, we need to make the mask into a
- * different structure. */
+/* If EVENT_MAX_ ever hits 0x003F, we need to make the mask into a
+ * different structure, as it can only handle a maximum left shift of 1<<63. */
/* Used only by control.c and test.c */
STATIC size_t write_escaped_data(const char *data, size_t len, char **out);
diff --git a/src/or/or.h b/src/or/or.h
index 0f1457f..1609587 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -1737,8 +1737,9 @@ typedef struct dir_connection_t {
typedef struct control_connection_t {
connection_t base_;
- uint32_t event_mask; /**< Bitfield: which events does this controller
- * care about? */
+ uint64_t event_mask; /**< Bitfield: which events does this controller
+ * care about?
+ * EVENT_MAX_ is >31, so we need a 64 bit mask */
/** True if we have sent a protocolinfo reply on this connection. */
unsigned int have_sent_protocolinfo:1;
More information about the tor-commits
mailing list