gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r33374 - in gnunet/src: multicast psyc


From: gnunet
Subject: [GNUnet-SVN] r33374 - in gnunet/src: multicast psyc
Date: Fri, 23 May 2014 16:41:42 +0200

Author: tg
Date: 2014-05-23 16:41:42 +0200 (Fri, 23 May 2014)
New Revision: 33374

Modified:
   gnunet/src/multicast/gnunet-service-multicast.c
   gnunet/src/multicast/multicast_api.c
   gnunet/src/psyc/gnunet-service-psyc.c
   gnunet/src/psyc/psyc_api.c
Log:
psyc, multicast: fixes, comments

Modified: gnunet/src/multicast/gnunet-service-multicast.c
===================================================================
--- gnunet/src/multicast/gnunet-service-multicast.c     2014-05-23 14:04:48 UTC 
(rev 33373)
+++ gnunet/src/multicast/gnunet-service-multicast.c     2014-05-23 14:41:42 UTC 
(rev 33374)
@@ -499,10 +499,16 @@
   { /* First client, send join request. */
     struct GNUNET_PeerIdentity *relays = (struct GNUNET_PeerIdentity *) 
&msg[1];
     uint32_t relay_count = ntohs (msg->relay_count);
-    struct GNUNET_MessageHeader *
-      join_msg = ((struct GNUNET_MessageHeader *)
-                  ((char *) &msg[1]) + relay_count * sizeof (*relays));
-    uint16_t join_msg_size = ntohs (join_msg->size);
+    uint16_t relay_size = relay_count * sizeof (*relays);
+    struct GNUNET_MessageHeader *join_msg = NULL;
+    uint16_t join_msg_size = 0;
+    if (sizeof (*msg) + relay_size + sizeof (struct GNUNET_MessageHeader)
+        <= ntohs (msg->header.size))
+    {
+      join_msg = (struct GNUNET_MessageHeader *)
+        (((char *) &msg[1]) + relay_size);
+      join_msg_size = ntohs (join_msg->size);
+    }
 
     struct MulticastJoinRequestMessage *
       req = GNUNET_malloc (sizeof (*req) + join_msg_size);
@@ -510,7 +516,8 @@
     req->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_REQUEST);
     req->group_key = grp->pub_key;
     GNUNET_CRYPTO_eddsa_key_get_public (&mem->priv_key, &req->member_key);
-    memcpy (&req[1], join_msg, join_msg_size);
+    if (0 < join_msg_size)
+      memcpy (&req[1], join_msg, join_msg_size);
 
     req->purpose.size = htonl (sizeof (*req) + join_msg_size
                                - sizeof (req->header)
@@ -556,17 +563,18 @@
 
   struct GNUNET_PeerIdentity *relays = (struct GNUNET_PeerIdentity *) 
&cl_dcsn[1];
   uint32_t relay_count = ntohs (cl_dcsn->relay_count);
+  uint16_t relay_size = relay_count * sizeof (*relays);
 
   struct GNUNET_MessageHeader *join_msg = NULL;
   uint16_t join_msg_size = 0;
-  if (sizeof (*cl_dcsn) + relay_count * sizeof (*relays) + sizeof (*m)
-      <= ntohs (m->size))
+  if (sizeof (*cl_dcsn) + relay_size + sizeof (*m) <= ntohs (m->size))
   {
-    join_msg = ((struct GNUNET_MessageHeader *)
-                ((char *) &cl_dcsn[1]) + relay_count * sizeof (*relays));
+    join_msg = (struct GNUNET_MessageHeader *)
+      (((char *) &cl_dcsn[1]) + relay_size);
     join_msg_size = ntohs (join_msg->size);
   }
 
+  int keep_dcsn = GNUNET_NO;
   struct MulticastJoinDecisionMessage *
     dcsn = GNUNET_malloc (sizeof (*dcsn) + join_msg_size);
   dcsn->header.size = htons (sizeof (*dcsn) + join_msg_size);
@@ -600,10 +608,10 @@
         if (GNUNET_YES == dcsn->is_admitted)
         { /* Member admitted, store join_decision. */
           mem->join_decision = dcsn;
+          keep_dcsn = GNUNET_YES;
         }
         else
         { /* Refused entry, disconnect clients. */
-          GNUNET_free (dcsn);
           struct ClientList *cl = mem->grp.clients_head;
           while (NULL != cl)
           {
@@ -618,6 +626,8 @@
   {
     /* FIXME: send join decision to remote peers */
   }
+  if (GNUNET_NO == keep_dcsn)
+    GNUNET_free (dcsn);
   GNUNET_SERVER_receive_done (client, GNUNET_OK);
 }
 

Modified: gnunet/src/multicast/multicast_api.c
===================================================================
--- gnunet/src/multicast/multicast_api.c        2014-05-23 14:04:48 UTC (rev 
33373)
+++ gnunet/src/multicast/multicast_api.c        2014-05-23 14:41:42 UTC (rev 
33374)
@@ -676,8 +676,10 @@
   dcsn->member_peer = jh->member_peer;
   dcsn->is_admitted = is_admitted;
   dcsn->relay_count = relay_count;
-  memcpy (&dcsn[1], relays, relay_size);
-  memcpy (((char *) &dcsn[1]) + relay_size, join_resp, join_resp_size);
+  if (0 < relay_size)
+    memcpy (&dcsn[1], relays, relay_size);
+  if (0 < join_resp_size)
+    memcpy (((char *) &dcsn[1]) + relay_size, join_resp, join_resp_size);
 
   GNUNET_CONTAINER_DLL_insert_tail (grp->tmit_head, grp->tmit_tail, mq);
   transmit_next (grp);
@@ -997,13 +999,15 @@
   uint16_t join_msg_size = (NULL != join_msg) ? ntohs (join_msg->size) : 0;
   struct MulticastMemberJoinMessage *
     join = GNUNET_malloc (sizeof (*join) + relay_size + join_msg_size);
+  join->header.size = htons (sizeof (*join) + relay_size + join_msg_size);
   join->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_MEMBER_JOIN);
-  join->header.size = htons (sizeof (*join) + relay_size + join_msg_size);
   join->group_key = *group_key;
   join->member_key = *member_key;
   join->origin = *origin;
-  memcpy (&join[1], relays, relay_size);
-  memcpy (((char *) &join[1]) + relay_size, join_msg, join_msg_size);
+  if (0 < relay_size)
+    memcpy (&join[1], relays, relay_size);
+  if (0 < join_msg_size)
+    memcpy (((char *) &join[1]) + relay_size, join_msg, join_msg_size);
 
   grp->reconnect_msg = (struct GNUNET_MessageHeader *) join;
   grp->is_origin = GNUNET_NO;

Modified: gnunet/src/psyc/gnunet-service-psyc.c
===================================================================
--- gnunet/src/psyc/gnunet-service-psyc.c       2014-05-23 14:04:48 UTC (rev 
33373)
+++ gnunet/src/psyc/gnunet-service-psyc.c       2014-05-23 14:41:42 UTC (rev 
33374)
@@ -628,7 +628,8 @@
   req->header.size = htons (sizeof (*req) + join_msg_size);
   req->header.type = htons (GNUNET_MESSAGE_TYPE_PSYC_JOIN_REQUEST);
   req->slave_key = *slave_key;
-  memcpy (&req[1], join_msg, join_msg_size);
+  if (0 < join_msg_size)
+    memcpy (&req[1], join_msg, join_msg_size);
 
   struct JoinMemTestClosure *jcls = GNUNET_malloc (sizeof (*jcls));
   jcls->slave_key = *slave_key;
@@ -1700,17 +1701,28 @@
 }
 
 
+/**
+ * Queue PSYC message parts for sending to multicast.
+ *
+ * @param ch           Channel to send to.
+ * @param client       Client the message originates from.
+ * @param data_size    Size of @a data.
+ * @param data         Concatenated message parts.
+ * @param first_ptype  First message part type in @a data.
+ * @param last_ptype   Last message part type in @a data.
+ */
 static void
 queue_message (struct Channel *ch,
                struct GNUNET_SERVER_Client *client,
-               const struct GNUNET_MessageHeader *msg,
+               size_t data_size,
+               const void *data,
                uint16_t first_ptype, uint16_t last_ptype)
 {
-  uint16_t size = ntohs (msg->size) - sizeof (*msg);
-  struct TransmitMessage *tmit_msg = GNUNET_malloc (sizeof (*tmit_msg) + size);
-  memcpy (&tmit_msg[1], &msg[1], size);
+  struct TransmitMessage *
+    tmit_msg = GNUNET_malloc (sizeof (*tmit_msg) + data_size);
+  memcpy (&tmit_msg[1], data, data_size);
   tmit_msg->client = client;
-  tmit_msg->size = size;
+  tmit_msg->size = data_size;
   tmit_msg->state = ch->tmit_state;
 
   GNUNET_CONTAINER_DLL_insert_tail (ch->tmit_head, ch->tmit_tail, tmit_msg);
@@ -1723,16 +1735,22 @@
 }
 
 
+/**
+ * Cancel transmission of current message.
+ *
+ * @param ch     Channel to send to.
+ * @param client  Client the message originates from.
+ */
 static void
-transmit_error (struct Channel *ch, struct GNUNET_SERVER_Client *client)
+transmit_cancel (struct Channel *ch, struct GNUNET_SERVER_Client *client)
 {
   uint16_t type = GNUNET_MESSAGE_TYPE_PSYC_MESSAGE_CANCEL;
 
   struct GNUNET_MessageHeader msg;
-  msg.size = ntohs (sizeof (msg));
-  msg.type = ntohs (type);
+  msg.size = htons (sizeof (msg));
+  msg.type = htons (type);
 
-  queue_message (ch, client, &msg, type, type);
+  queue_message (ch, client, sizeof (msg), &msg, type, type);
   transmit_message (ch);
 
   /* FIXME: cleanup */
@@ -1768,7 +1786,7 @@
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%p Message payload too large\n", ch);
     GNUNET_break (0);
-    transmit_error (ch, client);
+    transmit_cancel (ch, client);
     GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
     return;
   }
@@ -1782,12 +1800,13 @@
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "%p Received invalid message part from client.\n", ch);
     GNUNET_break (0);
-    transmit_error (ch, client);
+    transmit_cancel (ch, client);
     GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
     return;
   }
 
-  queue_message (ch, client, msg, first_ptype, last_ptype);
+  queue_message (ch, client, size - sizeof (*msg), &msg[1],
+                 first_ptype, last_ptype);
   transmit_message (ch);
 
   GNUNET_SERVER_receive_done (client, GNUNET_OK);

Modified: gnunet/src/psyc/psyc_api.c
===================================================================
--- gnunet/src/psyc/psyc_api.c  2014-05-23 14:04:48 UTC (rev 33373)
+++ gnunet/src/psyc/psyc_api.c  2014-05-23 14:41:42 UTC (rev 33374)
@@ -1272,7 +1272,7 @@
   struct GNUNET_PSYC_Channel *ch = &jh->mst->ch;
 
   struct MasterJoinDecision *dcsn;
-  struct GNUNET_PSYC_MessageHeader *pmsg;
+  struct GNUNET_PSYC_MessageHeader *pmsg = NULL;
   uint16_t pmsg_size = 0;
 /* FIXME:
   sizeof (*pmsg)
@@ -1285,14 +1285,14 @@
   struct MessageQueue *
     mq = GNUNET_malloc (sizeof (*mq) + sizeof (*dcsn) + relay_size + 
pmsg_size);
   dcsn = (struct MasterJoinDecision *) &mq[1];
+  dcsn->header.size = htons (sizeof (*dcsn) + relay_size + pmsg_size);
   dcsn->header.type = htons (GNUNET_MESSAGE_TYPE_PSYC_JOIN_DECISION);
-  dcsn->header.size = htons (sizeof (*mq) + sizeof (*dcsn)
-                             + relay_size + pmsg_size);
   dcsn->is_admitted = (GNUNET_YES == is_admitted) ? GNUNET_YES : GNUNET_NO;
   dcsn->slave_key = jh->slave_key;
 
   /* FIXME: add message parts to pmsg */
-  memcpy (&dcsn[1], pmsg, pmsg_size);
+  if (0 < pmsg_size)
+    memcpy (&dcsn[1], pmsg, pmsg_size);
 
   GNUNET_CONTAINER_DLL_insert_tail (ch->tmit_head, ch->tmit_tail, mq);
   transmit_next (ch);




reply via email to

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