From dc0c2d4477859fa97fb5642e37003aef5578dc74 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 27 Nov 2013 11:43:12 +0000 Subject: - fixed use after free due to uncanceled task --- src/set/set_api.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/set/set_api.c b/src/set/set_api.c index 54a5767e2..908fa1a1d 100644 --- a/src/set/set_api.c +++ b/src/set/set_api.c @@ -200,6 +200,11 @@ struct GNUNET_SET_ListenHandle * Time to wait until we try to reconnect on failure. */ struct GNUNET_TIME_Relative reconnect_backoff; + + /** + * Task for reconnecting when the listener fails. + */ + GNUNET_SCHEDULER_TaskIdentifier reconnect_task; }; @@ -357,7 +362,7 @@ handle_client_listener_error (void *cls, enum GNUNET_MQ_Error error) GNUNET_MQ_destroy (lh->mq); lh->mq = NULL; - GNUNET_SCHEDULER_add_delayed (lh->reconnect_backoff, listen_connect, lh); + lh->reconnect_task = GNUNET_SCHEDULER_add_delayed (lh->reconnect_backoff, listen_connect, lh); lh->reconnect_backoff = GNUNET_TIME_STD_BACKOFF (lh->reconnect_backoff); } @@ -651,6 +656,14 @@ listen_connect (void *cls, GNUNET_MQ_HANDLERS_END }; + if ((tc != NULL) &&(tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0) + { + LOG (GNUNET_ERROR_TYPE_DEBUG, "listener not reconnecting due to shutdown\n"); + return; + } + + lh->reconnect_task = GNUNET_SCHEDULER_NO_TASK; + GNUNET_assert (NULL == lh->client); lh->client = GNUNET_CLIENT_connect ("set", lh->cfg); if (NULL == lh->client) @@ -722,6 +735,11 @@ GNUNET_SET_listen_cancel (struct GNUNET_SET_ListenHandle *lh) GNUNET_CLIENT_disconnect (lh->client); lh->client = NULL; } + if (GNUNET_SCHEDULER_NO_TASK != lh->reconnect_task) + { + GNUNET_SCHEDULER_cancel (lh->reconnect_task); + lh->reconnect_task = GNUNET_SCHEDULER_NO_TASK; + } GNUNET_free (lh); } -- cgit v1.2.3