don't call GNUNET_SERVICE_client_continue twice; maybe fix bug resulting from destroy...
authorlurchi <lurchi@strangeplace.net>
Fri, 13 Oct 2017 18:56:09 +0000 (20:56 +0200)
committerlurchi <lurchi@strangeplace.net>
Fri, 13 Oct 2017 18:56:09 +0000 (20:56 +0200)
src/social/gnunet-service-social.c
src/social/social_api.c

index 30e113f1810b72816973247a2ddebeac22ae7e68..f888564dc457ab1ce6e73fb7cd40e03e6046ded6 100644 (file)
@@ -1878,23 +1878,9 @@ guest_enter (const struct GuestEnterRequest *greq, struct Guest **ret_gst)
 
 
 static int
-check_client_guest_enter (void *cls,
-                          const struct GuestEnterRequest *greq)
-{
-  return GNUNET_OK;
-}
-
-
-/**
- * Handle a connecting client entering a place as guest.
- */
-static void
-handle_client_guest_enter (void *cls,
-                           const struct GuestEnterRequest *greq)
+client_guest_enter (struct Client *c,
+                    const struct GuestEnterRequest *greq)
 {
-  // FIXME: this must not be called directly by gns_result_guest_enter because then
-  // GNUNET_SERVICE_client_continue is called twice
-  struct Client *c = cls;
   struct GNUNET_SERVICE_Client *client = c->client;
 
   GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
@@ -1906,9 +1892,7 @@ handle_client_guest_enter (void *cls,
                                                     remaining, 1, &app_id);
   if (0 == offset)
   {
-    GNUNET_break (0);
-    GNUNET_SERVICE_client_drop (client);
-    return;
+    return GNUNET_SYSERR;
   }
 
   struct Guest *gst = NULL;
@@ -1941,9 +1925,7 @@ handle_client_guest_enter (void *cls,
     break;
   }
   case GNUNET_SYSERR:
-    GNUNET_break (0);
-    GNUNET_SERVICE_client_drop (client);
-    return;
+    return GNUNET_SYSERR;
   }
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1953,9 +1935,36 @@ handle_client_guest_enter (void *cls,
   struct ClientListItem *cli = GNUNET_new (struct ClientListItem);
   cli->client = client;
   GNUNET_CONTAINER_DLL_insert (plc->clients_head, plc->clients_tail, cli);
+  return GNUNET_OK; 
+}
 
-  c->place = plc;
-  GNUNET_SERVICE_client_continue (client);
+
+static int
+check_client_guest_enter (void *cls,
+                          const struct GuestEnterRequest *greq)
+{
+  return GNUNET_OK;
+}
+
+
+/**
+ * Handle a connecting client entering a place as guest.
+ */
+static void
+handle_client_guest_enter (void *cls,
+                           const struct GuestEnterRequest *greq)
+{
+  // FIXME: this must not be called directly by gns_result_guest_enter because then
+  // GNUNET_SERVICE_client_continue is called twice
+  struct Client *c = cls;
+
+  if (GNUNET_SYSERR == client_guest_enter (c, greq))
+  {
+    GNUNET_break (0);
+    GNUNET_SERVICE_client_drop (c->client);
+    return;
+  }
+  GNUNET_SERVICE_client_continue (c->client);
 }
 
 
@@ -2032,7 +2041,7 @@ gns_result_guest_enter (void *cls, uint32_t rd_count,
   p += relay_size;
   GNUNET_memcpy (p, gcls->join_msg, join_msg_size);
 
-  handle_client_guest_enter (c, greq);
+  client_guest_enter (c, greq);
 
   GNUNET_free (gcls->app_id);
   if (NULL != gcls->password)
@@ -2261,6 +2270,7 @@ handle_client_place_leave (void *cls,
     }
   }
   //GNUNET_SERVICE_client_continue (client);
+  //GNUNET_SERVICE_client_drop (client);
 }
 
 
index 04b6711206f6c718e29fe2838d73c11ba42acff8..a190b2f26a03ed1b8ca7e85a9fca71fdb5459922 100644 (file)
@@ -1085,9 +1085,10 @@ place_disconnect (struct GNUNET_SOCIAL_Place *plc)
               plc);
   if (NULL != plc->mq)
   {
-    struct GNUNET_MQ_Envelope *env = GNUNET_MQ_get_last_envelope (plc->mq);
-    if (NULL != env)
+    //struct GNUNET_MQ_Envelope *env = GNUNET_MQ_get_last_envelope (plc->mq);
+    if (GNUNET_MQ_get_length (plc->mq) > 0)
     {
+      struct GNUNET_MQ_Envelope *env = GNUNET_MQ_get_last_envelope (plc->mq);
       GNUNET_MQ_notify_sent (env, (GNUNET_SCHEDULER_TaskCallback) place_disconnect, plc);
     }
     else