aboutsummaryrefslogtreecommitdiff
path: root/src/cadet
diff options
context:
space:
mode:
authorBart Polot <bart@net.in.tum.de>2014-07-28 05:12:43 +0000
committerBart Polot <bart@net.in.tum.de>2014-07-28 05:12:43 +0000
commit3c4cc4ef701c7eaccb1bece60f68996767c2a170 (patch)
tree50a093f4ac37b03e5391cebf92ace31289e24d0f /src/cadet
parent43630c9e9992fe0a047dab68ab69f7525b5d2063 (diff)
downloadgnunet-3c4cc4ef701c7eaccb1bece60f68996767c2a170.tar.gz
gnunet-3c4cc4ef701c7eaccb1bece60f68996767c2a170.zip
- fix trim-after-free
Diffstat (limited to 'src/cadet')
-rw-r--r--src/cadet/gnunet-service-cadet_tunnel.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/cadet/gnunet-service-cadet_tunnel.c b/src/cadet/gnunet-service-cadet_tunnel.c
index 92af3dbb7..d738a9d4e 100644
--- a/src/cadet/gnunet-service-cadet_tunnel.c
+++ b/src/cadet/gnunet-service-cadet_tunnel.c
@@ -200,6 +200,11 @@ struct CadetTunnel
200 */ 200 */
201 struct CadetTunnelDelayed *tq_head; 201 struct CadetTunnelDelayed *tq_head;
202 struct CadetTunnelDelayed *tq_tail; 202 struct CadetTunnelDelayed *tq_tail;
203
204 /**
205 * Task to trim connections if too many are present.
206 */
207 GNUNET_SCHEDULER_TaskIdentifier trim_connections_task;
203}; 208};
204 209
205 210
@@ -2288,6 +2293,8 @@ trim_connections (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
2288{ 2293{
2289 struct CadetTunnel *t = cls; 2294 struct CadetTunnel *t = cls;
2290 2295
2296 t->trim_connections_task = GNUNET_SCHEDULER_NO_TASK;
2297
2291 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) 2298 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
2292 return; 2299 return;
2293 2300
@@ -2345,7 +2352,8 @@ GCT_add_connection (struct CadetTunnel *t, struct CadetConnection *c)
2345 2352
2346 GNUNET_CONTAINER_DLL_insert (t->connection_head, t->connection_tail, aux); 2353 GNUNET_CONTAINER_DLL_insert (t->connection_head, t->connection_tail, aux);
2347 2354
2348 GNUNET_SCHEDULER_add_now (&trim_connections, t); 2355 if (GNUNET_SCHEDULER_NO_TASK != t->trim_connections_task)
2356 t->trim_connections_task = GNUNET_SCHEDULER_add_now (&trim_connections, t);
2349} 2357}
2350 2358
2351 2359
@@ -2637,11 +2645,19 @@ GCT_destroy (struct CadetTunnel *t)
2637 2645
2638 if (GNUNET_SCHEDULER_NO_TASK != t->destroy_task) 2646 if (GNUNET_SCHEDULER_NO_TASK != t->destroy_task)
2639 { 2647 {
2640 LOG (GNUNET_ERROR_TYPE_DEBUG, "cancelling %llX\n", t->destroy_task); 2648 LOG (GNUNET_ERROR_TYPE_DEBUG, "cancelling dest: %llX\n", t->destroy_task);
2641 GNUNET_SCHEDULER_cancel (t->destroy_task); 2649 GNUNET_SCHEDULER_cancel (t->destroy_task);
2642 t->destroy_task = GNUNET_SCHEDULER_NO_TASK; 2650 t->destroy_task = GNUNET_SCHEDULER_NO_TASK;
2643 } 2651 }
2644 2652
2653 if (GNUNET_SCHEDULER_NO_TASK != t->trim_connections_task)
2654 {
2655 LOG (GNUNET_ERROR_TYPE_DEBUG, "cancelling trim: %llX\n",
2656 t->trim_connections_task);
2657 GNUNET_SCHEDULER_cancel (t->trim_connections_task);
2658 t->trim_connections_task = GNUNET_SCHEDULER_NO_TASK;
2659 }
2660
2645 GNUNET_STATISTICS_update (stats, "# tunnels", -1, GNUNET_NO); 2661 GNUNET_STATISTICS_update (stats, "# tunnels", -1, GNUNET_NO);
2646 GCP_set_tunnel (t->peer, NULL); 2662 GCP_set_tunnel (t->peer, NULL);
2647 2663