gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r22276 - gnunet/src/mesh


From: gnunet
Subject: [GNUnet-SVN] r22276 - gnunet/src/mesh
Date: Mon, 25 Jun 2012 18:52:29 +0200

Author: bartpolot
Date: 2012-06-25 18:52:29 +0200 (Mon, 25 Jun 2012)
New Revision: 22276

Modified:
   gnunet/src/mesh/plugin_block_mesh.c
Log:
- implement mesh regex block plugin checks

Modified: gnunet/src/mesh/plugin_block_mesh.c
===================================================================
--- gnunet/src/mesh/plugin_block_mesh.c 2012-06-25 16:16:08 UTC (rev 22275)
+++ gnunet/src/mesh/plugin_block_mesh.c 2012-06-25 16:52:29 UTC (rev 22276)
@@ -36,6 +36,52 @@
 
 
 /**
+ * Check if the regex block is well formed, including all edges
+ * 
+ * @param block The start of the block.
+ * @param size The size of the block.
+ * 
+ * @return GNUNET_OK in case it's fine, GNUNET_SYSERR otherwise.
+ */
+static int
+check_mesh_regex_block (const struct MeshRegexBlock *block, size_t size)
+{
+  struct MeshRegexEdge *edge;
+  unsigned int n;
+  unsigned int n_token;
+  unsigned int i;
+  size_t offset;
+  char *aux;
+
+  offset = sizeof (struct MeshRegexBlock);
+  if (offset > size) // Is it safe to access the regex block?
+    return GNUNET_SYSERR;
+  n = ntohl (block->n_proof);
+  offset =+ n;
+  if (offset > size) // Is it safe to access the regex proof?
+    return GNUNET_SYSERR;
+  aux = (char *) &block[1];  // Skip regex block
+  aux = &aux[n];             // Skip regex proof
+  n = ntohl (block->n_edges);
+  for (i = 0; i < n; n++) // aux always points at the end of the previous block
+  {
+    offset += sizeof (struct MeshRegexEdge);
+    if (offset > size) // Is it safe to access the next edge block?
+      return GNUNET_SYSERR;
+    edge = (struct MeshRegexEdge *) aux;
+    n_token = ntohl (edge->n_token);
+    offset += n_token;
+    if (offset > size) // Is it safe to access the edge token?
+      return GNUNET_SYSERR;
+    aux = (char *) &edge[1]; // Skip edge block
+    aux = &aux[n_token];     // Skip edge token
+  }
+  // The total size should be exactly the size of (regex + all edges) blocks
+  return (offset == size) ? GNUNET_OK : GNUNET_SYSERR;
+}
+
+
+/**
  * Function called to validate a reply or a request.  For
  * request evaluation, simply pass "NULL" for the reply_block.
  * Note that it is assumed that the reply has already been
@@ -104,6 +150,58 @@
       GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash);
     }
     return GNUNET_BLOCK_EVALUATION_OK_MORE;
+  case GNUNET_BLOCK_TYPE_MESH_REGEX:
+    if (0 != xquery_size)
+    {
+      GNUNET_break_op (0);
+      return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
+    }
+    if (NULL == reply_block)
+      return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+    if (GNUNET_OK != check_mesh_regex_block (reply_block, reply_block_size))
+      return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+    if (NULL != bf)
+    {
+      GNUNET_CRYPTO_hash (reply_block, reply_block_size, &chash);
+      GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash);
+      if (NULL != *bf)
+      {
+        if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (*bf, &mhash))
+          return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE;
+      }
+      else
+      {
+        *bf = GNUNET_CONTAINER_bloomfilter_init (NULL, 8, BLOOMFILTER_K);
+      }
+      GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash);
+    }
+    return GNUNET_BLOCK_EVALUATION_OK_MORE;
+  case GNUNET_BLOCK_TYPE_MESH_REGEX_ACCEPT:
+    if (0 != xquery_size)
+    {
+      GNUNET_break_op (0);
+      return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
+    }
+    if (NULL == reply_block)
+      return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+    if (sizeof (struct MeshRegexAccept) != reply_block_size)  
+      return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+    if (NULL != bf)
+    {
+      GNUNET_CRYPTO_hash (reply_block, reply_block_size, &chash);
+      GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash);
+      if (NULL != *bf)
+      {
+        if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (*bf, &mhash))
+          return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE;
+      }
+      else
+      {
+        *bf = GNUNET_CONTAINER_bloomfilter_init (NULL, 8, BLOOMFILTER_K);
+      }
+      GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash);
+    }
+    return GNUNET_BLOCK_EVALUATION_OK_MORE;
   default:
     return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED;
   }




reply via email to

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