diff options
author | Andrea Shepard <andrea@torproject.org> | 2012-10-09 14:16:51 -0700 |
---|---|---|
committer | Andrea Shepard <andrea@torproject.org> | 2012-10-09 23:19:53 -0700 |
commit | bddfb9ffa85a0fe73545fb231a0847c4101758c1 (patch) | |
tree | 381d051786cadc514732cf93f73f52dbdb1cc003 | |
parent | f00b44ef8c82eb52fad19fd2218f485f1c5aceca (diff) | |
download | tor-bddfb9ffa85a0fe73545fb231a0847c4101758c1.tar.gz tor-bddfb9ffa85a0fe73545fb231a0847c4101758c1.zip |
Add magic number for type-checking channel casts
-rw-r--r-- | src/or/channel.h | 3 | ||||
-rw-r--r-- | src/or/channeltls.c | 37 | ||||
-rw-r--r-- | src/or/channeltls.h | 11 |
3 files changed, 47 insertions, 4 deletions
diff --git a/src/or/channel.h b/src/or/channel.h index c31806cbd4..27fba8fc00 100644 --- a/src/or/channel.h +++ b/src/or/channel.h @@ -26,6 +26,9 @@ typedef void (*channel_var_cell_handler_fn_ptr)(channel_t *, var_cell_t *); */ struct channel_s { + /* Magic number for type-checking cast macros */ + uint32_t magic; + /* Current channel state */ channel_state_t state; diff --git a/src/or/channeltls.c b/src/or/channeltls.c index 339663e00a..5d6a7a912f 100644 --- a/src/or/channeltls.c +++ b/src/or/channeltls.c @@ -102,8 +102,9 @@ channel_tls_connect(const tor_addr_t *addr, uint16_t port, const char *id_digest) { channel_tls_t *tlschan = tor_malloc_zero(sizeof(*tlschan)); - channel_t *chan = TLS_CHAN_TO_BASE(tlschan); + channel_t *chan = &(tlschan->_base); channel_init(chan); + chan->magic = TLS_CHAN_MAGIC; chan->state = CHANNEL_STATE_OPENING; chan->close = channel_tls_close_method; chan->describe_transport = channel_tls_describe_transport_method; @@ -233,12 +234,13 @@ channel_t * channel_tls_handle_incoming(or_connection_t *orconn) { channel_tls_t *tlschan = tor_malloc_zero(sizeof(*tlschan)); - channel_t *chan = TLS_CHAN_TO_BASE(tlschan); + channel_t *chan = &(tlschan->_base); tor_assert(orconn); tor_assert(!(orconn->chan)); channel_init(chan); + chan->magic = TLS_CHAN_MAGIC; chan->state = CHANNEL_STATE_OPENING; chan->close = channel_tls_close_method; chan->describe_transport = channel_tls_describe_transport_method; @@ -267,6 +269,37 @@ channel_tls_handle_incoming(or_connection_t *orconn) return chan; } +/********* + * Casts * + ********/ + +/** + * Cast a channel_tls_t to a channel_t. + */ + +channel_t * +channel_tls_to_base(channel_tls_t *tlschan) +{ + if (!tlschan) return NULL; + + return &(tlschan->_base); +} + +/** + * Cast a channel_t to a channel_tls_t, with appropriate type-checking + * asserts. + */ + +channel_tls_t * +channel_tls_from_base(channel_t *chan) +{ + if (!chan) return NULL; + + tor_assert(chan->magic == TLS_CHAN_MAGIC); + + return (channel_tls_t *)(chan); +} + /******************************************** * Method implementations for channel_tls_t * *******************************************/ diff --git a/src/or/channeltls.h b/src/or/channeltls.h index b38e12adcc..ca2fc88940 100644 --- a/src/or/channeltls.h +++ b/src/or/channeltls.h @@ -12,8 +12,10 @@ #include "or.h" #include "channel.h" -#define BASE_CHAN_TO_TLS(c) ((channel_tls_t *)(c)) -#define TLS_CHAN_TO_BASE(c) ((channel_t *)(c)) +#define BASE_CHAN_TO_TLS(c) (channel_tls_from_base((c))) +#define TLS_CHAN_TO_BASE(c) (channel_tls_to_base((c))) + +#define TLS_CHAN_MAGIC 0x8a192427U #ifdef _TOR_CHANNEL_INTERNAL @@ -32,6 +34,11 @@ channel_listener_t * channel_tls_get_listener(void); channel_listener_t * channel_tls_start_listener(void); channel_t * channel_tls_handle_incoming(or_connection_t *orconn); +/* Casts */ + +channel_t * channel_tls_to_base(channel_tls_t *tlschan); +channel_tls_t * channel_tls_from_base(channel_t *chan); + /* Things for connection_or.c to call back into */ ssize_t channel_tls_flush_some_cells(channel_tls_t *chan, ssize_t num_cells); int channel_tls_more_to_flush(channel_tls_t *chan); |