summaryrefslogtreecommitdiff
path: root/src/vpn
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-05-28 13:38:58 +0000
committerChristian Grothoff <christian@grothoff.org>2015-05-28 13:38:58 +0000
commit5b42c8e805cf5a60fc509c4016c212c3fe9ba806 (patch)
tree1ef0fea71e7fc31e4e869bc85131c5381f53f62e /src/vpn
parentfc1b9d4caffabba3411a27f62f9ea309a2cf8edc (diff)
-simplify logic, fix double free
Diffstat (limited to 'src/vpn')
-rw-r--r--src/vpn/gnunet-helper-vpn.c7
-rw-r--r--src/vpn/gnunet-service-vpn.c53
2 files changed, 17 insertions, 43 deletions
diff --git a/src/vpn/gnunet-helper-vpn.c b/src/vpn/gnunet-helper-vpn.c
index 521aba0f8..0ac398d53 100644
--- a/src/vpn/gnunet-helper-vpn.c
+++ b/src/vpn/gnunet-helper-vpn.c
@@ -50,7 +50,7 @@
* Should we print (interesting|debug) messages that can happen during
* normal operation?
*/
-#define DEBUG GNUNET_NO
+#define DEBUG GNUNET_YES
/**
* Maximum size of a GNUnet message (GNUNET_SERVER_MAX_MESSAGE_SIZE)
@@ -364,7 +364,7 @@ run (int fd_tun)
tests fail. With '||' the tests pass, but this process
keeps running --- but only for the 'GNS' test ---
even though the stdout is closed :-(. Very confusing. */
- while ((1 == read_open) || (1 == write_open))
+ while ((1 == read_open) && (1 == write_open))
{
FD_ZERO (&fds_w);
FD_ZERO (&fds_r);
@@ -547,6 +547,7 @@ PROCESS_BUFFER:
}
}
}
+ fprintf (stderr, "Existing select() loop\n");
}
@@ -568,6 +569,8 @@ main (int argc, char **argv)
int fd_tun;
int global_ret;
+ fprintf (stderr,
+ "VPN helper running!\n");
if (6 != argc)
{
fprintf (stderr, "Fatal: must supply 5 arguments!\n");
diff --git a/src/vpn/gnunet-service-vpn.c b/src/vpn/gnunet-service-vpn.c
index 62d6b3e23..2835c1956 100644
--- a/src/vpn/gnunet-service-vpn.c
+++ b/src/vpn/gnunet-service-vpn.c
@@ -84,11 +84,6 @@ struct DestinationChannel
struct DestinationEntry *destination;
/**
- * Pre-allocated channel for this destination, or NULL for none.
- */
- struct ChannelState *ts;
-
- /**
* Destination port this channel state is used for.
*/
uint16_t destination_port;
@@ -247,12 +242,6 @@ struct ChannelState
struct ChannelMessageQueueEntry *tmq_tail;
/**
- * Destination entry that has a pointer to this channel state;
- * NULL if this channel state is in the channel map.
- */
- struct DestinationChannel *destination_container;
-
- /**
* Destination to which this channel leads. Note that
* this struct is NOT in the destination_map (but a
* local copy) and that the 'heap_node' should always
@@ -552,6 +541,17 @@ free_channel_state (struct ChannelState *ts)
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Cleaning up channel state\n");
+ if (NULL != ts->th)
+ {
+ GNUNET_CADET_notify_transmit_ready_cancel (ts->th);
+ ts->th = NULL;
+ }
+ if (NULL != (channel = ts->channel))
+ {
+ ts->channel = NULL;
+ GNUNET_CADET_channel_destroy (channel);
+ return;
+ }
GNUNET_STATISTICS_update (stats,
gettext_noop ("# Active channels"),
-1, GNUNET_NO);
@@ -564,17 +564,7 @@ free_channel_state (struct ChannelState *ts)
GNUNET_free (tnq);
}
GNUNET_assert (0 == ts->tmq_length);
- if (NULL != ts->th)
- {
- GNUNET_CADET_notify_transmit_ready_cancel (ts->th);
- ts->th = NULL;
- }
GNUNET_assert (NULL == ts->destination.heap_node);
- if (NULL != (channel = ts->channel))
- {
- ts->channel = NULL;
- GNUNET_CADET_channel_destroy (channel);
- }
if (NULL != ts->search)
{
GNUNET_REGEX_search_cancel (ts->search);
@@ -596,12 +586,6 @@ free_channel_state (struct ChannelState *ts)
&key,
ts));
}
- if (NULL != ts->destination_container)
- {
- GNUNET_assert (ts == ts->destination_container->ts);
- ts->destination_container->ts = NULL;
- ts->destination_container = NULL;
- }
GNUNET_free (ts);
}
@@ -796,7 +780,6 @@ create_channel_to_destination (struct DestinationChannel *dt,
GNUNET_STATISTICS_update (stats,
gettext_noop ("# Cadet channels created"),
1, GNUNET_NO);
- GNUNET_assert (NULL == dt->ts);
switch (client_af)
{
case AF_INET:
@@ -813,8 +796,6 @@ create_channel_to_destination (struct DestinationChannel *dt,
ts->af = client_af;
ts->destination = *dt->destination;
ts->destination.heap_node = NULL; /* copy is NOT in destination heap */
- dt->ts = ts;
- ts->destination_container = dt; /* we are referenced from dt */
if (dt->destination->is_service)
{
ts->channel = GNUNET_CADET_channel_create (cadet_handle,
@@ -1102,14 +1083,9 @@ route_packet (struct DestinationEntry *destination,
GNUNET_h2s (&key));
/* need to either use the existing channel from the destination (if still
available) or create a fresh one */
- if (NULL == dt->ts)
- ts = create_channel_to_destination (dt, af);
- else
- ts = dt->ts;
+ ts = create_channel_to_destination (dt, af);
if (NULL == ts)
return;
- dt->ts = NULL;
- ts->destination_container = NULL; /* no longer 'contained' */
/* now bind existing "unbound" channel to our IP/port tuple */
ts->protocol = protocol;
ts->af = af;
@@ -2519,11 +2495,6 @@ free_destination_entry (struct DestinationEntry *de)
GNUNET_CONTAINER_DLL_remove (de->dt_head,
de->dt_tail,
dt);
- if (NULL != dt->ts)
- {
- free_channel_state (dt->ts);
- GNUNET_assert (NULL == dt->ts);
- }
GNUNET_free (dt);
}
if (NULL != de->heap_node)