gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r30903 - gnunet/src/set


From: gnunet
Subject: [GNUnet-SVN] r30903 - gnunet/src/set
Date: Wed, 27 Nov 2013 12:43:12 +0100

Author: dold
Date: 2013-11-27 12:43:12 +0100 (Wed, 27 Nov 2013)
New Revision: 30903

Modified:
   gnunet/src/set/set_api.c
Log:
- fixed use after free due to uncanceled task


Modified: gnunet/src/set/set_api.c
===================================================================
--- gnunet/src/set/set_api.c    2013-11-27 10:43:27 UTC (rev 30902)
+++ gnunet/src/set/set_api.c    2013-11-27 11:43:12 UTC (rev 30903)
@@ -200,6 +200,11 @@
    * 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 @@
   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 @@
     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_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);
 }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]