fix crash on monitor disconnect
authorChristian Grothoff <christian@grothoff.org>
Thu, 10 May 2018 09:35:02 +0000 (11:35 +0200)
committerChristian Grothoff <christian@grothoff.org>
Thu, 10 May 2018 09:35:27 +0000 (11:35 +0200)
src/namestore/gnunet-service-namestore.c

index a92b8104a51308f8383a5a83afd2825135ecb6df..ffc76a9117ac8b0e01a2845efc64cbbf144b6c48 100644 (file)
@@ -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 */
     }