aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2018-05-10 11:35:02 +0200
committerChristian Grothoff <christian@grothoff.org>2018-05-10 11:35:27 +0200
commitd3245124b4b2918c6dbd64aa237e96d96279e48b (patch)
tree73907ac010f4f5483401d3fc240da51c67dfca5f
parentf3e122bcb96dde2d406a6005013d96e67a045cd3 (diff)
fix crash on monitor disconnect
-rw-r--r--src/namestore/gnunet-service-namestore.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c
index a92b8104a5..ffc76a9117 100644
--- a/src/namestore/gnunet-service-namestore.c
+++ b/src/namestore/gnunet-service-namestore.c
@@ -918,6 +918,8 @@ client_disconnect_cb (void *cls,
client);
for (struct ZoneMonitor *zm = monitor_head; NULL != zm; zm = zm->next)
{
+ struct StoreActivity *san;
+
if (nc != zm->nc)
continue;
GNUNET_CONTAINER_DLL_remove (monitor_head,
@@ -928,11 +930,13 @@ client_disconnect_cb (void *cls,
GNUNET_SCHEDULER_cancel (zm->task);
zm->task = NULL;
}
- for (struct StoreActivity *sa = sa_head; NULL != sa; sa = sa->next)
+ for (struct StoreActivity *sa = sa_head; NULL != sa; sa = san)
{
+ san = sa->next;
if (zm == sa->zm_pos)
{
sa->zm_pos = zm->next;
+ /* this may free sa */
continue_store_activity (sa);
}
}
@@ -943,6 +947,7 @@ client_disconnect_cb (void *cls,
{
if (sa->nc == nc)
{
+ /* this may free sa */
free_store_activity (sa);
break; /* there can only be one per nc */
}