gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r17134 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r17134 - gnunet/src/transport
Date: Fri, 30 Sep 2011 11:02:13 +0200

Author: wachs
Date: 2011-09-30 11:02:12 +0200 (Fri, 30 Sep 2011)
New Revision: 17134

Modified:
   gnunet/src/transport/gnunet-service-transport_clients.c
Log:
check if transport client is still connected before sending SEND_OK


Modified: gnunet/src/transport/gnunet-service-transport_clients.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_clients.c     2011-09-30 
07:46:32 UTC (rev 17133)
+++ gnunet/src/transport/gnunet-service-transport_clients.c     2011-09-30 
09:02:12 UTC (rev 17134)
@@ -157,8 +157,12 @@
   GNUNET_assert (lookup_client (client) == NULL);
   tc = GNUNET_malloc (sizeof (struct TransportClient));
   tc->client = client;
+  GNUNET_CONTAINER_DLL_insert (clients_head, clients_tail, tc);
 
-  GNUNET_CONTAINER_DLL_insert (clients_head, clients_tail, tc);
+#if DEBUG_TRANSPORT
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+               "Client %X connected\n", tc);
+#endif
   return tc;
 }
 
@@ -177,12 +181,30 @@
 transmit_to_client_callback (void *cls, size_t size, void *buf)
 {
   struct TransportClient *tc = cls;
+  struct TransportClient *tmp;
   struct ClientMessageQueueEntry *q;
   const struct GNUNET_MessageHeader *msg;
   char *cbuf;
   uint16_t msize;
   size_t tsize;
 
+  tmp = clients_head;
+  while (tmp != NULL)
+  {
+    if (tc == tmp)
+      break;
+    tmp = tmp->next;
+  }
+
+  if (tc == NULL)
+  {
+#if DEBUG_TRANSPORT
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Transmission to client failed, client already 
disconnected.\n");
+#endif
+    return 0;
+  }
+
   tc->th = NULL;
   if (buf == NULL)
   {
@@ -455,6 +477,7 @@
 {
   struct SendTransmitContinuationContext *stcc = cls;
   struct SendOkMessage send_ok_msg;
+  struct TransportClient *tc;
 
   send_ok_msg.header.size = htons (sizeof (send_ok_msg));
   send_ok_msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK);
@@ -462,8 +485,18 @@
   send_ok_msg.latency =
       GNUNET_TIME_relative_hton (GNUNET_TIME_UNIT_FOREVER_REL);
   send_ok_msg.peer = stcc->target;
-  GST_clients_unicast (stcc->client, &send_ok_msg.header, GNUNET_NO);
-  GNUNET_SERVER_client_drop (stcc->client);
+  tc = lookup_client(stcc->client);
+  if (tc != NULL)
+  {
+#if DEBUG_TRANSPORT
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG | GNUNET_ERROR_TYPE_BULK,
+                "Sending `%s' to client %X\n",
+                "GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK",
+                tc);
+#endif
+    GST_clients_unicast (stcc->client, &send_ok_msg.header, GNUNET_NO);
+    GNUNET_SERVER_client_drop (stcc->client);
+  }
   GNUNET_free (stcc);
 }
 




reply via email to

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