[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)
{
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r30379 - gnunet/src/mesh,
gnunet <=