aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrea Shepard <andrea@torproject.org>2012-10-09 14:16:51 -0700
committerAndrea Shepard <andrea@torproject.org>2012-10-09 23:19:53 -0700
commitbddfb9ffa85a0fe73545fb231a0847c4101758c1 (patch)
tree381d051786cadc514732cf93f73f52dbdb1cc003 /src
parentf00b44ef8c82eb52fad19fd2218f485f1c5aceca (diff)
downloadtor-bddfb9ffa85a0fe73545fb231a0847c4101758c1.tar
tor-bddfb9ffa85a0fe73545fb231a0847c4101758c1.tar.gz
Add magic number for type-checking channel casts
Diffstat (limited to 'src')
-rw-r--r--src/or/channel.h3
-rw-r--r--src/or/channeltls.c37
-rw-r--r--src/or/channeltls.h11
3 files changed, 47 insertions, 4 deletions
diff --git a/src/or/channel.h b/src/or/channel.h
index c31806cbd..27fba8fc0 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 339663e00..5d6a7a912 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 b38e12adc..ca2fc8894 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);