gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [gnunet] branch master updated (0a8c135ee -> 882a4ce1b)


From: gnunet
Subject: [GNUnet-SVN] [gnunet] branch master updated (0a8c135ee -> 882a4ce1b)
Date: Sun, 20 May 2018 23:59:04 +0200

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

grothoff pushed a change to branch master
in repository gnunet.

    from 0a8c135ee off by 0 in log msg
     new d080cb1ed check return values from GNSRECORD_record_serialize/size 
always
     new 6fd410f8e fix serialization/deserialization error in namestore 
deferred monitor logic
     new 1477e20ba update ignore
     new 2e6c62160 update ignore
     new 277cec42b update ignore
     new 882a4ce1b disable debug logic

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 contrib/scripts/.gitignore                |   2 +
 doc/documentation/.gitignore              |   7 +
 src/consensus/.gitignore                  |   1 +
 src/gns/gnunet-service-gns.c              |  27 ++-
 src/gns/gnunet-service-gns_resolver.c     |  21 +-
 src/gnsrecord/gnsrecord_crypto.c          |  83 ++++---
 src/gnsrecord/gnsrecord_serialization.c   |  42 +++-
 src/include/gnunet_gnsrecord_lib.h        |   4 +-
 src/namestore/gnunet-service-namestore.c  | 377 +++++++++++++++++-------------
 src/namestore/namestore_api.c             |  20 +-
 src/namestore/namestore_api_monitor.c     |   7 +-
 src/namestore/plugin_namestore_flat.c     |  16 +-
 src/namestore/plugin_namestore_postgres.c |  11 +-
 src/namestore/plugin_namestore_sqlite.c   |   9 +-
 14 files changed, 398 insertions(+), 229 deletions(-)
 create mode 100644 contrib/scripts/.gitignore

diff --git a/contrib/scripts/.gitignore b/contrib/scripts/.gitignore
new file mode 100644
index 000000000..547c89185
--- /dev/null
+++ b/contrib/scripts/.gitignore
@@ -0,0 +1,2 @@
+gnunet-chk.py
+removetrailingwhitespace.py
diff --git a/doc/documentation/.gitignore b/doc/documentation/.gitignore
index 2e914d9c9..f490c3412 100644
--- a/doc/documentation/.gitignore
+++ b/doc/documentation/.gitignore
@@ -1,2 +1,9 @@
 stamp-1
 version2.texi
+manual
+*.fn
+*.fns
+*.ky
+*.pg
+*.tp
+*.vr
diff --git a/src/consensus/.gitignore b/src/consensus/.gitignore
index d49147d17..8050d760e 100644
--- a/src/consensus/.gitignore
+++ b/src/consensus/.gitignore
@@ -3,3 +3,4 @@ gnunet-consensus-profiler
 gnunet-service-consensus
 test_consensus_api
 resource.log.master
+consensus-simulation.py
diff --git a/src/gns/gnunet-service-gns.c b/src/gns/gnunet-service-gns.c
index cffae824d..aaa4aeb0e 100644
--- a/src/gns/gnunet-service-gns.c
+++ b/src/gns/gnunet-service-gns.c
@@ -334,30 +334,43 @@ client_connect_cb (void *cls,
  * @param rd the record data
  */
 static void
-send_lookup_response (void* cls,
+send_lookup_response (void *cls,
                       uint32_t rd_count,
                       const struct GNUNET_GNSRECORD_Data *rd)
 {
   struct ClientLookupHandle *clh = cls;
   struct GnsClient *gc = clh->gc;
- struct GNUNET_MQ_Envelope *env;
+  struct GNUNET_MQ_Envelope *env;
   struct LookupResultMessage *rmsg;
-  size_t len;
+  ssize_t len;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Sending LOOKUP_RESULT message with %u results\n",
               (unsigned int) rd_count);
   len = GNUNET_GNSRECORD_records_get_size (rd_count,
                                            rd);
+  if (len < 0)
+  {
+    GNUNET_break (0);
+    GNUNET_SERVICE_client_drop (gc->client);
+    return;
+  }
+  if (len > UINT16_MAX - sizeof (*rmsg))
+  {
+    GNUNET_break (0);
+    GNUNET_SERVICE_client_drop (gc->client);
+    return;
+  }
   env = GNUNET_MQ_msg_extra (rmsg,
                              len,
                              GNUNET_MESSAGE_TYPE_GNS_LOOKUP_RESULT);
   rmsg->id = clh->request_id;
   rmsg->rd_count = htonl (rd_count);
-  GNUNET_GNSRECORD_records_serialize (rd_count,
-                                      rd,
-                                      len,
-                                      (char*) &rmsg[1]);
+  GNUNET_assert (len ==
+                 GNUNET_GNSRECORD_records_serialize (rd_count,
+                                                     rd,
+                                                     len,
+                                                     (char*) &rmsg[1]));
   GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (gc->client),
                   env);
   GNUNET_CONTAINER_DLL_remove (gc->clh_head,
diff --git a/src/gns/gnunet-service-gns_resolver.c 
b/src/gns/gnunet-service-gns_resolver.c
index b66516363..8593e281e 100644
--- a/src/gns/gnunet-service-gns_resolver.c
+++ b/src/gns/gnunet-service-gns_resolver.c
@@ -280,7 +280,7 @@ struct VpnContext
   /**
    * Number of bytes in @e rd_data.
    */
-  size_t rd_data_size;
+  ssize_t rd_data_size;
 };
 
 
@@ -1319,7 +1319,7 @@ vpn_allocation_cb (void *cls,
   vpn_ctx->vpn_request = NULL;
   rh->vpn_ctx = NULL;
   GNUNET_assert (GNUNET_OK ==
-                GNUNET_GNSRECORD_records_deserialize (vpn_ctx->rd_data_size,
+                GNUNET_GNSRECORD_records_deserialize ((size_t) 
vpn_ctx->rd_data_size,
                                                       vpn_ctx->rd_data,
                                                       vpn_ctx->rd_count,
                                                       rd));
@@ -1901,13 +1901,20 @@ handle_gns_resolution_result (void *cls,
            vpn_ctx->rh = rh;
            vpn_ctx->rd_data_size = GNUNET_GNSRECORD_records_get_size (rd_count,
                                                                       rd);
-           vpn_ctx->rd_data = GNUNET_malloc (vpn_ctx->rd_data_size);
+            if (vpn_ctx->rd_data_size < 0)
+            {
+             GNUNET_break_op (0);
+              GNUNET_free (vpn_ctx);
+              fail_resolution (rh);
+             return;
+            }
+           vpn_ctx->rd_data = GNUNET_malloc ((size_t) vpn_ctx->rd_data_size);
             vpn_ctx->rd_count = rd_count;
            GNUNET_assert (vpn_ctx->rd_data_size ==
-                           (size_t) GNUNET_GNSRECORD_records_serialize 
(rd_count,
-                                                                       rd,
-                                                                       
vpn_ctx->rd_data_size,
-                                                                       
vpn_ctx->rd_data));
+                           GNUNET_GNSRECORD_records_serialize (rd_count,
+                                                               rd,
+                                                               (size_t) 
vpn_ctx->rd_data_size,
+                                                               
vpn_ctx->rd_data));
            vpn_ctx->vpn_request = GNUNET_VPN_redirect_to_peer (vpn_handle,
                                                                af,
                                                                ntohs 
(vpn->proto),
diff --git a/src/gnsrecord/gnsrecord_crypto.c b/src/gnsrecord/gnsrecord_crypto.c
index 6d59a545a..6d3887392 100644
--- a/src/gnsrecord/gnsrecord_crypto.c
+++ b/src/gnsrecord/gnsrecord_crypto.c
@@ -87,9 +87,8 @@ block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
               const struct GNUNET_GNSRECORD_Data *rd,
               unsigned int rd_count)
 {
-  size_t payload_len = GNUNET_GNSRECORD_records_get_size (rd_count,
-                                                          rd);
-  char payload[sizeof (uint32_t) + payload_len];
+  ssize_t payload_len = GNUNET_GNSRECORD_records_get_size (rd_count,
+                                                           rd);
   struct GNUNET_GNSRECORD_Block *block;
   struct GNUNET_CRYPTO_EcdsaPrivateKey *dkey;
   struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
@@ -98,8 +97,16 @@ block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey 
*key,
   uint32_t rd_count_nbo;
   struct GNUNET_TIME_Absolute now;
 
+  if (payload_len < 0)
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
   if (payload_len > GNUNET_GNSRECORD_MAX_BLOCK_SIZE)
+  {
+    GNUNET_break (0);
     return NULL;
+  }
   /* convert relative to absolute times */
   now = GNUNET_TIME_absolute_get ();
   for (unsigned int i=0;i<rd_count;i++)
@@ -117,39 +124,43 @@ block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey 
*key,
   }
   /* serialize */
   rd_count_nbo = htonl (rd_count);
-  GNUNET_memcpy (payload,
-                 &rd_count_nbo,
-                 sizeof (uint32_t));
-  GNUNET_assert (payload_len ==
-                GNUNET_GNSRECORD_records_serialize (rd_count,
-                                                     rdc,
-                                                    payload_len,
-                                                     &payload[sizeof 
(uint32_t)]));
-  block = GNUNET_malloc (sizeof (struct GNUNET_GNSRECORD_Block) +
-                        sizeof (uint32_t) +
-                         payload_len);
-  block->purpose.size = htonl (sizeof (uint32_t) +
-                               payload_len +
-                              sizeof (struct 
GNUNET_CRYPTO_EccSignaturePurpose) +
-                              sizeof (struct GNUNET_TIME_AbsoluteNBO));
-  block->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN);
-  block->expiration_time = GNUNET_TIME_absolute_hton (expire);
-  /* encrypt and sign */
-  dkey = GNUNET_CRYPTO_ecdsa_private_key_derive (key,
-                                                 label,
-                                                 "gns");
-  GNUNET_CRYPTO_ecdsa_key_get_public (dkey,
-                                      &block->derived_key);
-  derive_block_aes_key (&iv,
-                        &skey,
-                        label,
-                        pkey);
-  GNUNET_break (payload_len + sizeof (uint32_t) ==
-               GNUNET_CRYPTO_symmetric_encrypt (payload,
-                                                 payload_len + sizeof 
(uint32_t),
-                                                 &skey,
-                                                 &iv,
-                                                 &block[1]));
+  {
+    char payload[sizeof (uint32_t) + payload_len];
+
+    GNUNET_memcpy (payload,
+                   &rd_count_nbo,
+                   sizeof (uint32_t));
+    GNUNET_assert (payload_len ==
+                   GNUNET_GNSRECORD_records_serialize (rd_count,
+                                                       rdc,
+                                                       payload_len,
+                                                       &payload[sizeof 
(uint32_t)]));
+    block = GNUNET_malloc (sizeof (struct GNUNET_GNSRECORD_Block) +
+                           sizeof (uint32_t) +
+                           payload_len);
+    block->purpose.size = htonl (sizeof (uint32_t) +
+                                 payload_len +
+                                 sizeof (struct 
GNUNET_CRYPTO_EccSignaturePurpose) +
+                                 sizeof (struct GNUNET_TIME_AbsoluteNBO));
+    block->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN);
+    block->expiration_time = GNUNET_TIME_absolute_hton (expire);
+    /* encrypt and sign */
+    dkey = GNUNET_CRYPTO_ecdsa_private_key_derive (key,
+                                                   label,
+                                                   "gns");
+    GNUNET_CRYPTO_ecdsa_key_get_public (dkey,
+                                        &block->derived_key);
+    derive_block_aes_key (&iv,
+                          &skey,
+                          label,
+                          pkey);
+    GNUNET_break (payload_len + sizeof (uint32_t) ==
+                  GNUNET_CRYPTO_symmetric_encrypt (payload,
+                                                   payload_len + sizeof 
(uint32_t),
+                                                   &skey,
+                                                   &iv,
+                                                   &block[1]));
+  }
   if (GNUNET_OK !=
       GNUNET_CRYPTO_ecdsa_sign (dkey,
                                 &block->purpose,
diff --git a/src/gnsrecord/gnsrecord_serialization.c 
b/src/gnsrecord/gnsrecord_serialization.c
index 6164fa3db..77118ab94 100644
--- a/src/gnsrecord/gnsrecord_serialization.c
+++ b/src/gnsrecord/gnsrecord_serialization.c
@@ -37,6 +37,12 @@
 
 #define LOG(kind,...) GNUNET_log_from (kind, "gnsrecord",__VA_ARGS__)
 
+/**
+ * Set to 1 to check that all records are well-formed (can be converted
+ * to string) during serialization/deserialization.
+ */
+#define DEBUG_GNSRECORDS 0
+
 GNUNET_NETWORK_STRUCT_BEGIN
 
 
@@ -78,9 +84,9 @@ GNUNET_NETWORK_STRUCT_END
  *
  * @param rd_count number of records in the rd array
  * @param rd array of #GNUNET_GNSRECORD_Data with @a rd_count elements
- * @return the required size to serialize
+ * @return the required size to serialize, -1 on error
  */
-size_t
+ssize_t
 GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
                                   const struct GNUNET_GNSRECORD_Data *rd)
 {
@@ -89,10 +95,34 @@ GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
   ret = sizeof (struct NetworkRecord) * rd_count;
   for (unsigned int i=0;i<rd_count;i++)
   {
-    GNUNET_assert ((ret + rd[i].data_size) >= ret);
+    if ((ret + rd[i].data_size) < ret)
+    {
+      GNUNET_break (0);
+      return -1;
+    }
     ret += rd[i].data_size;
+#if DEBUG_GNSRECORDS
+    {
+      char *str;
+
+      str = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
+                                              rd[i].data,
+                                              rd[i].data_size);
+      if (NULL == str)
+      {
+        GNUNET_break_op (0);
+        return -1;
+      }
+      GNUNET_free (str);
+    }
+#endif
+  }
+  if (ret > SSIZE_MAX)
+  {
+    GNUNET_break (0);
+    return -1;
   }
-  return ret;
+  return (ssize_t) ret;
 }
 
 
@@ -146,7 +176,7 @@ GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
                    rd[i].data,
                    rd[i].data_size);
     off += rd[i].data_size;
-#if GNUNET_EXTRA_LOGGING
+#if DEBUG_GNSRECORDS
     {
       char *str;
 
@@ -156,7 +186,7 @@ GNUNET_GNSRECORD_records_serialize (unsigned int rd_count,
       if (NULL == str)
       {
         GNUNET_break_op (0);
-        return GNUNET_SYSERR;
+        return -1;
       }
       GNUNET_free (str);
     }
diff --git a/src/include/gnunet_gnsrecord_lib.h 
b/src/include/gnunet_gnsrecord_lib.h
index 38346ada3..56dadef3a 100644
--- a/src/include/gnunet_gnsrecord_lib.h
+++ b/src/include/gnunet_gnsrecord_lib.h
@@ -411,9 +411,9 @@ GNUNET_GNSRECORD_number_to_typename (uint32_t type);
  *
  * @param rd_count number of records in the @a rd array
  * @param rd array of #GNUNET_GNSRECORD_Data with @a rd_count elements
- * @return the required size to serialize
+ * @return the required size to serialize, -1 on error
  */
-size_t
+ssize_t
 GNUNET_GNSRECORD_records_get_size (unsigned int rd_count,
                                   const struct GNUNET_GNSRECORD_Data *rd);
 
diff --git a/src/namestore/gnunet-service-namestore.c 
b/src/namestore/gnunet-service-namestore.c
index 8e88558de..2044010df 100644
--- a/src/namestore/gnunet-service-namestore.c
+++ b/src/namestore/gnunet-service-namestore.c
@@ -278,12 +278,6 @@ struct StoreActivity
   const struct RecordStoreMessage *rsm;
 
   /**
-   * Array of record data to store (without NICK unless this is about
-   * #GNUNET_GNS_EMPTY_LABEL_AT).  Length is in @e rd_count.
-   */
-  struct GNUNET_GNSRECORD_Data *rd;
-
-  /**
    * Next zone monitor that still needs to be notified about this PUT.
    */
   struct ZoneMonitor *zm_pos;
@@ -293,11 +287,6 @@ struct StoreActivity
    */
   char *conv_name;
 
-  /**
-   * How many records do we try to store?
-   */
-  unsigned int rd_count;
-
 };
 
 
@@ -436,9 +425,6 @@ free_store_activity (struct StoreActivity *sa)
   GNUNET_CONTAINER_DLL_remove (sa_head,
                                sa_tail,
                                sa);
-  GNUNET_array_grow (sa->rd,
-                     sa->rd_count,
-                     0);
   GNUNET_free (sa->conv_name);
   GNUNET_free (sa);
 }
@@ -551,6 +537,7 @@ merge_with_nick_records (const struct GNUNET_GNSRECORD_Data 
*nick_rd,
   size_t req;
   char *data;
   size_t data_offset;
+  struct GNUNET_GNSRECORD_Data *target;
 
   (*rdc_res) = 1 + rd2_length;
   if (0 == 1 + rd2_length)
@@ -560,38 +547,52 @@ merge_with_nick_records (const struct 
GNUNET_GNSRECORD_Data *nick_rd,
     return;
   }
   req = sizeof (struct GNUNET_GNSRECORD_Data) + nick_rd->data_size;
-  for (unsigned int c=0; c< rd2_length; c++)
-    req += sizeof (struct GNUNET_GNSRECORD_Data) + rd2[c].data_size;
-  (*rd_res) = GNUNET_malloc (req);
-  data = (char *) &(*rd_res)[1 + rd2_length];
+  for (unsigned int i=0; i<rd2_length; i++)
+  {
+    const struct GNUNET_GNSRECORD_Data *orig = &rd2[i];
+
+    if (req + sizeof (struct GNUNET_GNSRECORD_Data) + orig->data_size < req)
+    {
+      GNUNET_break (0);
+      (*rd_res) = NULL;
+      return;
+    }
+    req += sizeof (struct GNUNET_GNSRECORD_Data) + orig->data_size;
+  }
+  target = GNUNET_malloc (req);
+  (*rd_res) = target;
+  data = (char *) &target[1 + rd2_length];
   data_offset = 0;
   latest_expiration = 0;
-  for (unsigned int c=0; c< rd2_length; c++)
+  for (unsigned int i=0;i<rd2_length;i++)
   {
-    if (0 != (rd2[c].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION))
+    const struct GNUNET_GNSRECORD_Data *orig = &rd2[i];
+
+    if (0 != (orig->flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION))
     {
-      if ((GNUNET_TIME_absolute_get().abs_value_us + rd2[c].expiration_time) >
-        latest_expiration)
-          latest_expiration = rd2[c].expiration_time;
+      if ((GNUNET_TIME_absolute_get().abs_value_us + orig->expiration_time) >
+          latest_expiration)
+        latest_expiration = orig->expiration_time;
     }
-    else if (rd2[c].expiration_time > latest_expiration)
-      latest_expiration = rd2[c].expiration_time;
-    (*rd_res)[c] = rd2[c];
-    (*rd_res)[c].data = (void *) &data[data_offset];
+    else if (orig->expiration_time > latest_expiration)
+      latest_expiration = orig->expiration_time;
+    target[i] = *orig;
+    target[i].data = (void *) &data[data_offset];
     GNUNET_memcpy (&data[data_offset],
-                   rd2[c].data,
-                   rd2[c].data_size);
-    data_offset += (*rd_res)[c].data_size;
+                   orig->data,
+                   orig->data_size);
+    data_offset += orig->data_size;
   }
   /* append nick */
-  (*rd_res)[rd2_length] = *nick_rd;
-  (*rd_res)[rd2_length].expiration_time = latest_expiration;
-  (*rd_res)[rd2_length].data = (void *) &data[data_offset];
-  GNUNET_memcpy ((void *) (*rd_res)[rd2_length].data,
+  target[rd2_length] = *nick_rd;
+  target[rd2_length].expiration_time = latest_expiration;
+  target[rd2_length].data = (void *) &data[data_offset];
+  GNUNET_memcpy (&data[data_offset],
                 nick_rd->data,
                 nick_rd->data_size);
-  data_offset += (*rd_res)[rd2_length].data_size;
-  GNUNET_assert (req == (sizeof (struct GNUNET_GNSRECORD_Data)) * (*rdc_res) + 
data_offset);
+  data_offset += nick_rd->data_size;
+  GNUNET_assert (req ==
+                 (sizeof (struct GNUNET_GNSRECORD_Data)) * (*rdc_res) + 
data_offset);
 }
 
 
@@ -620,11 +621,16 @@ send_lookup_response (struct NamestoreClient *nc,
   struct GNUNET_GNSRECORD_Data *res;
   unsigned int res_count;
   size_t name_len;
-  size_t rd_ser_len;
+  ssize_t rd_ser_len;
   char *name_tmp;
   char *rd_ser;
 
   nick = get_nick_record (zone_key);
+
+  GNUNET_assert (-1 !=
+                 GNUNET_GNSRECORD_records_get_size (rd_count,
+                                                    rd));
+
   if ( (NULL != nick) &&
        (0 != strcmp (name,
                     GNUNET_GNS_EMPTY_LABEL_AT)))
@@ -643,26 +649,44 @@ send_lookup_response (struct NamestoreClient *nc,
     res = (struct GNUNET_GNSRECORD_Data *) rd;
   }
 
+  GNUNET_assert (-1 !=
+                 GNUNET_GNSRECORD_records_get_size (res_count,
+                                                    res));
+
+
   name_len = strlen (name) + 1;
   rd_ser_len = GNUNET_GNSRECORD_records_get_size (res_count,
                                                   res);
+  if (rd_ser_len < 0)
+  {
+    GNUNET_break (0);
+    GNUNET_SERVICE_client_drop (nc->client);
+    return;
+  }
+  if (rd_ser_len >= UINT16_MAX - name_len - sizeof (*zir_msg))
+  {
+    GNUNET_break (0);
+    GNUNET_SERVICE_client_drop (nc->client);
+    return;
+  }
   env = GNUNET_MQ_msg_extra (zir_msg,
                             name_len + rd_ser_len,
                             GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT);
   zir_msg->gns_header.r_id = htonl (request_id);
   zir_msg->name_len = htons (name_len);
   zir_msg->rd_count = htons (res_count);
-  zir_msg->rd_len = htons (rd_ser_len);
+  zir_msg->rd_len = htons ((uint16_t) rd_ser_len);
   zir_msg->private_key = *zone_key;
   name_tmp = (char *) &zir_msg[1];
   GNUNET_memcpy (name_tmp,
                 name,
                 name_len);
   rd_ser = &name_tmp[name_len];
-  GNUNET_GNSRECORD_records_serialize (res_count,
-                                     res,
-                                     rd_ser_len,
-                                     rd_ser);
+  GNUNET_assert (rd_ser_len ==
+                 GNUNET_GNSRECORD_records_serialize (res_count,
+                                                     res,
+                                                     rd_ser_len,
+                                                     rd_ser));
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Sending RECORD_RESULT message with %u records\n",
              res_count);
@@ -865,72 +889,70 @@ static void
 continue_store_activity (struct StoreActivity *sa)
 {
   const struct RecordStoreMessage *rp_msg = sa->rsm;
+  unsigned int rd_count;
+  size_t name_len;
+  size_t rd_ser_len;
+  uint32_t rid;
+  const char *name_tmp;
+  const char *rd_ser;
 
-  for (struct ZoneMonitor *zm = sa->zm_pos;
-       NULL != zm;
-       zm = sa->zm_pos)
-  {
-    if ( (0 != memcmp (&rp_msg->private_key,
-                       &zm->zone,
-                       sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey))) &&
-         (0 != memcmp (&zm->zone,
-                       &zero,
-                       sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey))) )
-      sa->zm_pos = zm->next; /* not interesting to this monitor */
-    if (zm->limit == zm->iteration_cnt)
-    {
-      zm->sa_waiting = GNUNET_YES;
-      zm->sa_waiting_start = GNUNET_TIME_absolute_get ();
-      if (NULL != zm->sa_wait_warning)
-        GNUNET_SCHEDULER_cancel (zm->sa_wait_warning);
-      zm->sa_wait_warning = GNUNET_SCHEDULER_add_delayed 
(MONITOR_STALL_WARN_DELAY,
-                                                          &warn_monitor_slow,
-                                                          zm);
-      return; /* blocked on zone monitor */
-    }
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Notifying monitor about changes under label `%s'\n",
-                sa->conv_name);
-    zm->limit--;
-    send_lookup_response (zm->nc,
-                          0,
-                          &rp_msg->private_key,
-                          sa->conv_name,
-                          sa->rd_count,
-                          sa->rd);
-    sa->zm_pos = zm->next;
-  }
-  /* great, done with the monitors, unpack (again) for refresh_block operation 
*/
+  rid = ntohl (rp_msg->gns_header.r_id);
+  name_len = ntohs (rp_msg->name_len);
+  rd_count = ntohs (rp_msg->rd_count);
+  rd_ser_len = ntohs (rp_msg->rd_len);
+  name_tmp = (const char *) &rp_msg[1];
+  rd_ser = &name_tmp[name_len];
   {
-    size_t name_len;
-    size_t rd_ser_len;
-    uint32_t rid;
-    const char *name_tmp;
-    const char *rd_ser;
-    unsigned int rd_count;
-
-    rid = ntohl (rp_msg->gns_header.r_id);
-    name_len = ntohs (rp_msg->name_len);
-    rd_count = ntohs (rp_msg->rd_count);
-    rd_ser_len = ntohs (rp_msg->rd_len);
-    name_tmp = (const char *) &rp_msg[1];
-    rd_ser = &name_tmp[name_len];
+    struct GNUNET_GNSRECORD_Data rd[GNUNET_NZL(rd_count)];
+
+    /* We did this before, must succeed again */
+    GNUNET_assert (GNUNET_OK ==
+                   GNUNET_GNSRECORD_records_deserialize (rd_ser_len,
+                                                         rd_ser,
+                                                         rd_count,
+                                                         rd));
+
+    for (struct ZoneMonitor *zm = sa->zm_pos;
+         NULL != zm;
+         zm = sa->zm_pos)
     {
-      struct GNUNET_GNSRECORD_Data rd[rd_count];
-
-      /* We did this before, must succeed again */
-      GNUNET_assert (GNUNET_OK ==
-                     GNUNET_GNSRECORD_records_deserialize (rd_ser_len,
-                                                           rd_ser,
-                                                           rd_count,
-                                                           rd));
-      refresh_block (sa->nc,
-                     rid,
-                     &rp_msg->private_key,
-                     sa->conv_name,
-                     rd_count,
-                     rd);
+      if ( (0 != memcmp (&rp_msg->private_key,
+                         &zm->zone,
+                         sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey))) &&
+           (0 != memcmp (&zm->zone,
+                         &zero,
+                         sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey))) )
+        sa->zm_pos = zm->next; /* not interesting to this monitor */
+      if (zm->limit == zm->iteration_cnt)
+      {
+        zm->sa_waiting = GNUNET_YES;
+        zm->sa_waiting_start = GNUNET_TIME_absolute_get ();
+        if (NULL != zm->sa_wait_warning)
+          GNUNET_SCHEDULER_cancel (zm->sa_wait_warning);
+        zm->sa_wait_warning = GNUNET_SCHEDULER_add_delayed 
(MONITOR_STALL_WARN_DELAY,
+                                                            &warn_monitor_slow,
+                                                            zm);
+        return; /* blocked on zone monitor */
+      }
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "Notifying monitor about changes under label `%s'\n",
+                  sa->conv_name);
+      zm->limit--;
+      send_lookup_response (zm->nc,
+                            0,
+                            &rp_msg->private_key,
+                            sa->conv_name,
+                            rd_count,
+                            rd);
+      sa->zm_pos = zm->next;
     }
+    /* great, done with the monitors, unpack (again) for refresh_block 
operation */
+    refresh_block (sa->nc,
+                   rid,
+                   &rp_msg->private_key,
+                   sa->conv_name,
+                   rd_count,
+                   rd);
   }
   GNUNET_SERVICE_client_continue (sa->nc->client);
   free_store_activity (sa);
@@ -1073,12 +1095,13 @@ struct RecordLookupContext
   /**
    * FIXME.
    */
-  size_t rd_ser_len;
+  ssize_t rd_ser_len;
 };
 
 
 /**
  * FIXME.
+ *
  * @param seq sequence number of the record
  */
 static void
@@ -1090,60 +1113,93 @@ lookup_it (void *cls,
            const struct GNUNET_GNSRECORD_Data *rd)
 {
   struct RecordLookupContext *rlc = cls;
-  struct GNUNET_GNSRECORD_Data *rd_res;
-  unsigned int rdc_res;
 
   (void) private_key;
   (void) seq;
-  if (0 == strcmp (label,
+  if (0 != strcmp (label,
                    rlc->label))
+    return;
+  rlc->found = GNUNET_YES;
+  if (0 == rd_count)
   {
-    rlc->found = GNUNET_YES;
-    if (0 != rd_count)
+    rlc->rd_ser_len = 0;
+    rlc->res_rd_count = 0;
+    rlc->res_rd = NULL;
+    return;
+  }
+  if ( (NULL != rlc->nick) &&
+       (0 != strcmp (label,
+                     GNUNET_GNS_EMPTY_LABEL_AT)) )
+  {
+    /* Merge */
+    struct GNUNET_GNSRECORD_Data *rd_res;
+    unsigned int rdc_res;
+
+    rd_res = NULL;
+    rdc_res = 0;
+    rlc->nick->flags = (rlc->nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ 
GNUNET_GNSRECORD_RF_PRIVATE;
+    merge_with_nick_records (rlc->nick,
+                             rd_count,
+                             rd,
+                             &rdc_res,
+                             &rd_res);
+    rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rdc_res,
+                                                         rd_res);
+    if (rlc->rd_ser_len < 0)
     {
-      if ( (NULL != rlc->nick) &&
-           (0 != strcmp (label,
-                         GNUNET_GNS_EMPTY_LABEL_AT)) )
-      {
-        /* Merge */
-        rd_res = NULL;
-        rdc_res = 0;
-        rlc->nick->flags = (rlc->nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ 
GNUNET_GNSRECORD_RF_PRIVATE;
-        merge_with_nick_records (rlc->nick,
-                                 rd_count,
-                                rd,
-                                 &rdc_res,
-                                &rd_res);
-        rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rdc_res,
-                                                             rd_res);
-        rlc->res_rd_count = rdc_res;
-        rlc->res_rd = GNUNET_malloc (rlc->rd_ser_len);
+      GNUNET_break (0);
+      GNUNET_free  (rd_res);
+      rlc->found = GNUNET_NO;
+      rlc->rd_ser_len = 0;
+      return;
+    }
+    rlc->res_rd_count = rdc_res;
+    rlc->res_rd = GNUNET_malloc (rlc->rd_ser_len);
+    if (rlc->rd_ser_len !=
         GNUNET_GNSRECORD_records_serialize (rdc_res,
                                             rd_res,
                                             rlc->rd_ser_len,
-                                            rlc->res_rd);
-
-        GNUNET_free  (rd_res);
-        GNUNET_free  (rlc->nick);
-        rlc->nick = NULL;
-      }
-      else
-      {
-        rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
-                                                             rd);
-        rlc->res_rd_count = rd_count;
-        rlc->res_rd = GNUNET_malloc (rlc->rd_ser_len);
+                                            rlc->res_rd))
+    {
+      GNUNET_break (0);
+      GNUNET_free  (rlc->res_rd);
+      rlc->res_rd = NULL;
+      rlc->res_rd_count = 0;
+      rlc->rd_ser_len = 0;
+      GNUNET_free  (rd_res);
+      rlc->found = GNUNET_NO;
+      return;
+    }
+    GNUNET_free (rd_res);
+    GNUNET_free (rlc->nick);
+    rlc->nick = NULL;
+  }
+  else
+  {
+    rlc->rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
+                                                         rd);
+    if (rlc->rd_ser_len < 0)
+    {
+      GNUNET_break (0);
+      rlc->found = GNUNET_NO;
+      rlc->rd_ser_len = 0;
+      return;
+    }
+    rlc->res_rd_count = rd_count;
+    rlc->res_rd = GNUNET_malloc (rlc->rd_ser_len);
+    if (rlc->rd_ser_len !=
         GNUNET_GNSRECORD_records_serialize (rd_count,
                                             rd,
                                             rlc->rd_ser_len,
-                                            rlc->res_rd);
-      }
-    }
-    else
+                                            rlc->res_rd))
     {
-      rlc->rd_ser_len = 0;
-      rlc->res_rd_count = 0;
+      GNUNET_break (0);
+      GNUNET_free  (rlc->res_rd);
       rlc->res_rd = NULL;
+      rlc->res_rd_count = 0;
+      rlc->rd_ser_len = 0;
+      rlc->found = GNUNET_NO;
+      return;
     }
   }
 }
@@ -1331,8 +1387,6 @@ handle_record_store (void *cls,
   rd_ser = &name_tmp[name_len];
   {
     struct GNUNET_GNSRECORD_Data rd[GNUNET_NZL(rd_count)];
-    struct GNUNET_GNSRECORD_Data rd_clean[GNUNET_NZL(rd_count)];
-    unsigned int rd_clean_off;
 
     if (GNUNET_OK !=
        GNUNET_GNSRECORD_records_deserialize (rd_ser_len,
@@ -1381,6 +1435,9 @@ handle_record_store (void *cls,
     {
       /* remove "NICK" records, unless this is for the
          #GNUNET_GNS_EMPTY_LABEL_AT label */
+      struct GNUNET_GNSRECORD_Data rd_clean[GNUNET_NZL(rd_count)];
+      unsigned int rd_clean_off;
+
       rd_clean_off = 0;
       for (unsigned int i=0;i<rd_count;i++)
       {
@@ -1420,12 +1477,6 @@ handle_record_store (void *cls,
                    ntohs (rp_msg->gns_header.header.size));
     sa->zm_pos = monitor_head;
     sa->conv_name = conv_name;
-    GNUNET_array_grow (sa->rd,
-                       sa->rd_count,
-                       rd_clean_off);
-    GNUNET_memcpy (sa->rd,
-                   rd_clean,
-                   sizeof (struct GNUNET_GNSRECORD_Data) * rd_clean_off);
     continue_store_activity (sa);
   }
 }
@@ -1479,7 +1530,7 @@ handle_zone_to_name_it (void *cls,
   struct ZoneToNameResponseMessage *ztnr_msg;
   int16_t res;
   size_t name_len;
-  size_t rd_ser_len;
+  ssize_t rd_ser_len;
   size_t msg_size;
   char *name_tmp;
   char *rd_tmp;
@@ -1490,7 +1541,14 @@ handle_zone_to_name_it (void *cls,
              name);
   res = GNUNET_YES;
   name_len = (NULL == name) ? 0 : strlen (name) + 1;
-  rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count, rd);
+  rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
+                                                  rd);
+  if (rd_ser_len < 0)
+  {
+    GNUNET_break (0);
+    ztn_ctx->success = GNUNET_SYSERR;
+    return;
+  }
   msg_size = sizeof (struct ZoneToNameResponseMessage) + name_len + rd_ser_len;
   if (msg_size >= GNUNET_MAX_MESSAGE_SIZE)
   {
@@ -1513,10 +1571,11 @@ handle_zone_to_name_it (void *cls,
                 name,
                 name_len);
   rd_tmp = &name_tmp[name_len];
-  GNUNET_GNSRECORD_records_serialize (rd_count,
-                                     rd,
-                                     rd_ser_len,
-                                     rd_tmp);
+  GNUNET_assert (rd_ser_len ==
+                 GNUNET_GNSRECORD_records_serialize (rd_count,
+                                                     rd,
+                                                     rd_ser_len,
+                                                     rd_tmp));
   ztn_ctx->success = GNUNET_OK;
   GNUNET_MQ_send (ztn_ctx->nc->mq,
                  env);
diff --git a/src/namestore/namestore_api.c b/src/namestore/namestore_api.c
index 57bf8f81b..f2aaa43c8 100644
--- a/src/namestore/namestore_api.c
+++ b/src/namestore/namestore_api.c
@@ -1033,7 +1033,7 @@ GNUNET_NAMESTORE_records_store (struct 
GNUNET_NAMESTORE_Handle *h,
   struct GNUNET_MQ_Envelope *env;
   char *name_tmp;
   char *rd_ser;
-  size_t rd_ser_len;
+  ssize_t rd_ser_len;
   size_t name_len;
   uint32_t rid;
   struct RecordStoreMessage *msg;
@@ -1045,6 +1045,18 @@ GNUNET_NAMESTORE_records_store (struct 
GNUNET_NAMESTORE_Handle *h,
     GNUNET_break (0);
     return NULL;
   }
+  rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
+                                                  rd);
+  if (rd_ser_len < 0)
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
+  if (rd_ser_len > UINT16_MAX)
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
   rid = get_op_id (h);
   qe = GNUNET_new (struct GNUNET_NAMESTORE_QueueEntry);
   qe->h = h;
@@ -1056,8 +1068,6 @@ GNUNET_NAMESTORE_records_store (struct 
GNUNET_NAMESTORE_Handle *h,
                                     qe);
 
   /* setup msg */
-  rd_ser_len = GNUNET_GNSRECORD_records_get_size (rd_count,
-                                                  rd);
   env = GNUNET_MQ_msg_extra (msg,
                              name_len + rd_ser_len,
                              GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE);
@@ -1077,8 +1087,10 @@ GNUNET_NAMESTORE_records_store (struct 
GNUNET_NAMESTORE_Handle *h,
                                             rd,
                                             rd_ser_len,
                                             rd_ser);
-  if (0 > sret)
+  if ( (0 > sret) ||
+       (sret != rd_ser_len) )
   {
+    GNUNET_break (0);
     GNUNET_free (env);
     return NULL;
   }
diff --git a/src/namestore/namestore_api_monitor.c 
b/src/namestore/namestore_api_monitor.c
index 9ba90833b..16780ad0c 100644
--- a/src/namestore/namestore_api_monitor.c
+++ b/src/namestore/namestore_api_monitor.c
@@ -144,6 +144,11 @@ check_result (void *cls,
   rd_len = ntohs (lrm->rd_len);
   rd_count = ntohs (lrm->rd_count);
   name_len = ntohs (lrm->name_len);
+  if (name_len > MAX_NAME_LEN)
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
   exp_lrm_len = sizeof (struct RecordResultMessage) + name_len + rd_len;
   if (lrm_len != exp_lrm_len)
   {
@@ -156,7 +161,7 @@ check_result (void *cls,
     return GNUNET_SYSERR;
   }
   name_tmp = (const char *) &lrm[1];
-  if ((name_tmp[name_len -1] != '\0') || (name_len > MAX_NAME_LEN))
+  if (name_tmp[name_len -1] != '\0')
   {
     GNUNET_break (0);
     return GNUNET_SYSERR;
diff --git a/src/namestore/plugin_namestore_flat.c 
b/src/namestore/plugin_namestore_flat.c
index 35d8424b4..95edb9d87 100644
--- a/src/namestore/plugin_namestore_flat.c
+++ b/src/namestore/plugin_namestore_flat.c
@@ -301,7 +301,7 @@ store_and_free_entries (void *cls,
   char *line;
   char *zone_private_key;
   char *record_data_b64;
-  size_t data_size;
+  ssize_t data_size;
 
   (void) key;
   GNUNET_STRINGS_base64_encode ((char*)entry->private_key,
@@ -309,6 +309,18 @@ store_and_free_entries (void *cls,
                                 &zone_private_key);
   data_size = GNUNET_GNSRECORD_records_get_size (entry->record_count,
                                                  entry->record_data);
+  if (data_size < 0)
+  {
+    GNUNET_break (0);
+    GNUNET_free (zone_private_key);
+    return GNUNET_SYSERR;
+  }
+  if (data_size >= UINT16_MAX)
+  {
+    GNUNET_break (0);
+    GNUNET_free (zone_private_key);
+    return GNUNET_SYSERR;
+  }
   {
     char data[data_size];
     ssize_t ret;
@@ -318,7 +330,7 @@ store_and_free_entries (void *cls,
                                              data_size,
                                              data);
     if ( (ret < 0) ||
-        (data_size != (size_t) ret) )
+        (data_size != ret) )
     {
       GNUNET_break (0);
       GNUNET_free (zone_private_key);
diff --git a/src/namestore/plugin_namestore_postgres.c 
b/src/namestore/plugin_namestore_postgres.c
index d7907b1a6..09fdd760f 100644
--- a/src/namestore/plugin_namestore_postgres.c
+++ b/src/namestore/plugin_namestore_postgres.c
@@ -220,7 +220,7 @@ namestore_postgres_store_records (void *cls,
   struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
   uint64_t rvalue;
   uint32_t rd_count32 = (uint32_t) rd_count;
-  size_t data_size;
+  ssize_t data_size;
 
   memset (&pkey,
           0,
@@ -238,7 +238,12 @@ namestore_postgres_store_records (void *cls,
                                      UINT64_MAX);
   data_size = GNUNET_GNSRECORD_records_get_size (rd_count,
                                                 rd);
-  if (data_size > 64 * 65536)
+  if (data_size < 0)
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  if (data_size >= UINT16_MAX)
   {
     GNUNET_break (0);
     return GNUNET_SYSERR;
@@ -287,7 +292,7 @@ namestore_postgres_store_records (void *cls,
                                              data_size,
                                              data);
     if ( (ret < 0) ||
-        (data_size != (size_t) ret) )
+        (data_size != ret) )
     {
       GNUNET_break (0);
       return GNUNET_SYSERR;
diff --git a/src/namestore/plugin_namestore_sqlite.c 
b/src/namestore/plugin_namestore_sqlite.c
index 34e548613..81391ce8a 100644
--- a/src/namestore/plugin_namestore_sqlite.c
+++ b/src/namestore/plugin_namestore_sqlite.c
@@ -313,7 +313,7 @@ namestore_sqlite_store_records (void *cls,
   int n;
   struct GNUNET_CRYPTO_EcdsaPublicKey pkey;
   uint64_t rvalue;
-  size_t data_size;
+  ssize_t data_size;
 
   memset (&pkey,
          0,
@@ -332,6 +332,11 @@ namestore_sqlite_store_records (void *cls,
                                      UINT64_MAX);
   data_size = GNUNET_GNSRECORD_records_get_size (rd_count,
                                                  rd);
+  if (data_size < 0)
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
   if (data_size > 64 * 65536)
   {
     GNUNET_break (0);
@@ -352,7 +357,7 @@ namestore_sqlite_store_records (void *cls,
                                              data_size,
                                              data);
     if ( (ret < 0) ||
-        (data_size != (size_t) ret) )
+        (data_size != ret) )
     {
       GNUNET_break (0);
       return GNUNET_SYSERR;

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



reply via email to

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