gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r30379 - gnunet/src/mesh


From: gnunet
Subject: [GNUnet-SVN] r30379 - gnunet/src/mesh
Date: Mon, 21 Oct 2013 17:59:45 +0200

Author: bartpolot
Date: 2013-10-21 17:59:44 +0200 (Mon, 21 Oct 2013)
New Revision: 30379

Modified:
   gnunet/src/mesh/gnunet-service-mesh_peer.c
Log:
- fix reentrant looping


Modified: gnunet/src/mesh/gnunet-service-mesh_peer.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh_peer.c  2013-10-21 15:39:26 UTC (rev 
30378)
+++ gnunet/src/mesh/gnunet-service-mesh_peer.c  2013-10-21 15:59:44 UTC (rev 
30379)
@@ -1073,17 +1073,30 @@
 {
   struct MeshPeerQueue *q;
   struct MeshPeerQueue *next;
+  struct MeshPeerQueue *prev;
 
   for (q = peer->queue_head; NULL != q; q = next)
   {
-    next = q->next;
+    prev = q->prev;
     if (q->c == c)
     {
       LOG (GNUNET_ERROR_TYPE_DEBUG,
-                  "connection_cancel_queue %s\n",
+                  "GMP_cancel_queue %s\n",
                   GNUNET_MESH_DEBUG_M2S (q->type));
       queue_destroy (q, GNUNET_YES);
+
+      /* Get next from prev, q->next might be already freed:
+       * queue destroy -> callback -> GMC_destroy -> cancel_queues -> here
+       */
+      if (NULL == prev)
+        next = peer->queue_head;
+      else
+        next = prev->next;
     }
+    else
+    {
+      next = q->next;
+    }
   }
   if (NULL == peer->queue_head)
   {




reply via email to

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