gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [gnunet] branch master updated: basics of handling of msgs


From: gnunet
Subject: [GNUnet-SVN] [gnunet] branch master updated: basics of handling of msgs from communicator
Date: Fri, 25 Jan 2019 21:32:40 +0100

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository gnunet.

The following commit(s) were added to refs/heads/master by this push:
     new 612b5ec8e basics of handling of msgs from communicator
612b5ec8e is described below

commit 612b5ec8e3a3f1388631e9c637aef085e3767777
Author: Christian Grothoff <address@hidden>
AuthorDate: Fri Jan 25 21:32:36 2019 +0100

    basics of handling of msgs from communicator
---
 src/transport/gnunet-service-tng.c | 98 +++++++++++++++++++++++++++++++++++---
 1 file changed, 91 insertions(+), 7 deletions(-)

diff --git a/src/transport/gnunet-service-tng.c 
b/src/transport/gnunet-service-tng.c
index 3cccf5173..9f0e7845c 100644
--- a/src/transport/gnunet-service-tng.c
+++ b/src/transport/gnunet-service-tng.c
@@ -459,8 +459,7 @@ struct TransportDVLearn
   
   /* Followed by @e num_hops `struct GNUNET_PeerIdentity` values,
      excluding the initiator of the DV trace; the last entry is the
-     current sender; the current peer must not be included except if
-     it is the sender. */
+     current sender; the current peer must not be included. */
   
 };
 
@@ -2258,7 +2257,20 @@ struct CommunicatorMessageContext
 static void
 finish_cmc_handling (struct CommunicatorMessageContext *cmc)
 {
-  // FIXME: if (0 != ntohl (im->fc_on)) => send ACK when done to communicator 
for flow control!
+  if (0 != ntohl (cmc->im.fc_on))
+  {
+    /* send ACK when done to communicator for flow control! */
+    struct GNUNET_MQ_Envelope *env;
+    struct GNUNET_TRANSPORT_IncomingMessageAck *ack;
+
+    env = GNUNET_MQ_msg (ack,
+                        GNUNET_MESSAGE_TYPE_TRANSPORT_INCOMING_MSG_ACK);
+    ack->reserved = htonl (0);
+    ack->fc_id = cmc->im.fc_id;
+    ack->sender = cmc->im.sender;
+    GNUNET_MQ_send (cmc->tc->mq,
+                   env);
+  }
   GNUNET_SERVICE_client_continue (cmc->tc->client);
 
   GNUNET_free (cmc);
@@ -2294,7 +2306,24 @@ static int
 check_fragment_box (void *cls,
                    const struct TransportFragmentBox *fb)
 {
-  // FIXME! check that off + size-of-payload <= total-length!
+  uint16_t size = ntohs (fb->header.size);
+  uint16_t bsize = size - sizeof (*fb);
+
+  if (0 == bsize)
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+  if (bsize + ntohs (fb->frag_off) > ntohs (fb->msg_size)) 
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+  if (ntohs (fb->frag_off) >= ntohs (fb->msg_size)) 
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
   return GNUNET_YES;
 }
 
@@ -2394,7 +2423,13 @@ static int
 check_backchannel_encapsulation (void *cls,
                                 const struct 
TransportBackchannelEncapsulationMessage *be)
 {
-  // FIXME: do work!
+  uint16_t size = ntohs (be->header.size);
+
+  if (size - sizeof (*be) < sizeof (struct GNUNET_MessageHeader))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
   return GNUNET_YES;
 }
 
@@ -2444,7 +2479,32 @@ static int
 check_dv_learn (void *cls,
                const struct TransportDVLearn *dvl)
 {
-  // FIXME: do work!
+  uint16_t size = ntohs (dvl->header.size);
+  uint16_t num_hops = ntohs (dvl->num_hops);
+  const struct GNUNET_PeerIdentity *hops = (const struct GNUNET_PeerIdentity 
*) &dvl[1];
+
+  if (size != sizeof (*dvl) + num_hops * sizeof (struct GNUNET_PeerIdentity))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+  for (unsigned int i=0;i<num_hops;i++)
+  {
+    if (0 == memcmp (&dvl->initiator,
+                    &hops[i],
+                    sizeof (struct GNUNET_PeerIdentity)))
+    {
+      GNUNET_break_op (0);
+      return GNUNET_SYSERR;
+    }
+    if (0 == memcmp (&GST_my_identity,
+                    &hops[i],
+                    sizeof (struct GNUNET_PeerIdentity)))
+    {
+      GNUNET_break_op (0);
+      return GNUNET_SYSERR;
+    }
+  }
   return GNUNET_YES;
 }
 
@@ -2477,7 +2537,31 @@ static int
 check_dv_box (void *cls,
              const struct TransportDVBox *dvb)
 {
-  // FIXME: do work!
+  uint16_t size = ntohs (dvb->header.size);
+  uint16_t num_hops = ntohs (dvb->num_hops);
+  const struct GNUNET_PeerIdentity *hops = (const struct GNUNET_PeerIdentity 
*) &dvb[1];
+  const struct GNUNET_MessageHeader *inbox = (const struct 
GNUNET_MessageHeader *) &hops[num_hops];
+  uint16_t isize;
+  uint16_t itype;
+
+  if (size < sizeof (*dvb) + num_hops * sizeof (struct GNUNET_PeerIdentity) + 
sizeof (struct GNUNET_MessageHeader))
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+  isize = ntohs (inbox->size);
+  if (size != sizeof (*dvb) + num_hops * sizeof (struct GNUNET_PeerIdentity) + 
isize) 
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+  itype = ntohs (inbox->type);
+  if ( (GNUNET_MESSAGE_TYPE_TRANSPORT_DV_BOX == itype) ||
+       (GNUNET_MESSAGE_TYPE_TRANSPORT_DV_LEARN == itype) )
+  {
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
   return GNUNET_YES;
 }
 

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

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