diff options
author | Nick Mathewson <nickm@torproject.org> | 2014-09-08 15:16:45 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2014-09-08 15:16:45 -0400 |
commit | 2ecaa59bd794f1cba6a4ce3b82b73a8b4d27b2ab (patch) | |
tree | c718f598e33b4859b3ddb26925841415632e397b /src/or | |
parent | 781b477bc8af868661450473cdebb5d70312fd61 (diff) | |
parent | d229025fefa6faa228d9154e391293d9d5b320d3 (diff) | |
download | tor-2ecaa59bd794f1cba6a4ce3b82b73a8b4d27b2ab.tar.gz tor-2ecaa59bd794f1cba6a4ce3b82b73a8b4d27b2ab.zip |
Merge remote-tracking branch 'origin/maint-0.2.5'
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/control.c | 8 | ||||
-rw-r--r-- | src/or/control.h | 4 | ||||
-rw-r--r-- | src/or/or.h | 5 |
3 files changed, 9 insertions, 8 deletions
diff --git a/src/or/control.c b/src/or/control.c index cd2df5ac34..60aa869439 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)); @@ -2884,7 +2884,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 68a6c244d0..494f04b3bd 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 3683607741..f28bb21126 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; |