Restrict update to positive priority deltas
authorDavid Barksdale <amatus@amat.us>
Mon, 20 Feb 2017 19:08:08 +0000 (13:08 -0600)
committerDavid Barksdale <amatus@amat.us>
Mon, 20 Feb 2017 19:11:19 +0000 (13:11 -0600)
This is only ever called with positive values and the mysql and postgres
plugins were not handling negative values correctly anyway.

src/datastore/gnunet-service-datastore.c
src/datastore/plugin_datastore_heap.c
src/datastore/plugin_datastore_mysql.c
src/datastore/plugin_datastore_postgres.c
src/datastore/plugin_datastore_sqlite.c
src/datastore/plugin_datastore_template.c
src/include/gnunet_datastore_plugin.h

index 6f1bd2b6d9e0ce83b8ad046bfd8d5cfc59c594b8..445c3576e559cbddd23295035bfcc91ffba7b0c0 100644 (file)
@@ -889,7 +889,7 @@ check_present (void *cls,
          expiration.abs_value_us))
       plugin->api->update (plugin->api->cls,
                           uid,
-                           (int32_t) ntohl (dm->priority),
+                           ntohl (dm->priority),
                            GNUNET_TIME_absolute_ntoh (dm->expiration),
                            &check_present_continuation,
                           pc->client);
index 977d599d20ba3e111388f9e10cddce82e3e7d116..199c03a507e2a484074118a079fda5c3a8931c5a 100644 (file)
@@ -611,9 +611,7 @@ heap_plugin_get_expiration (void *cls, PluginDatumProcessor proc,
  * @param cls our `struct Plugin *`
  * @param uid unique identifier of the datum
  * @param delta by how much should the priority
- *     change?  If priority + delta < 0 the
- *     priority should be set to 0 (never go
- *     negative).
+ *     change?
  * @param expire new expiration time should be the
  *     MAX of any existing expiration time and
  *     this value
@@ -623,7 +621,7 @@ heap_plugin_get_expiration (void *cls, PluginDatumProcessor proc,
 static void
 heap_plugin_update (void *cls,
                    uint64_t uid,
-                   int delta,
+                   uint32_t delta,
                    struct GNUNET_TIME_Absolute expire,
                    PluginUpdateCont cont,
                    void *cont_cls)
@@ -638,8 +636,9 @@ heap_plugin_update (void *cls,
     GNUNET_CONTAINER_heap_update_cost (value->expire_heap,
                                       expire.abs_value_us);
   }
-  if ( (delta < 0) && (value->priority < - delta) )
-    value->priority = 0;
+  /* Saturating add, don't overflow */
+  if (value->priority > UINT32_MAX - delta)
+    value->priority = UINT32_MAX;
   else
     value->priority += delta;
   cont (cont_cls, GNUNET_OK, NULL);
index d76b4ccb475060e25e2c2c229e71d0ad265a2476..1067064aa1ca0cfdb824ee49dbf5d918844c1a4a 100644 (file)
@@ -395,9 +395,7 @@ mysql_plugin_put (void *cls,
  * @param cls our "struct Plugin*"
  * @param uid unique identifier of the datum
  * @param delta by how much should the priority
- *     change?  If priority + delta < 0 the
- *     priority should be set to 0 (never go
- *     negative).
+ *     change?
  * @param expire new expiration time should be the
  *     MAX of any existing expiration time and
  *     this value
@@ -407,13 +405,12 @@ mysql_plugin_put (void *cls,
 static void
 mysql_plugin_update (void *cls,
                      uint64_t uid,
-                     int delta,
+                     uint32_t delta,
                      struct GNUNET_TIME_Absolute expire,
                      PluginUpdateCont cont,
                      void *cont_cls)
 {
   struct Plugin *plugin = cls;
-  uint32_t idelta = (uint32_t) delta;
   uint64_t lexpire = expire.abs_value_us;
   int ret;
 
@@ -424,7 +421,7 @@ mysql_plugin_update (void *cls,
              GNUNET_STRINGS_absolute_time_to_string (expire));
 
   struct GNUNET_MY_QueryParam params_update[] = {
-    GNUNET_MY_query_param_uint32 (&idelta),
+    GNUNET_MY_query_param_uint32 (&delta),
     GNUNET_MY_query_param_uint64 (&lexpire),
     GNUNET_MY_query_param_uint64 (&lexpire),
     GNUNET_MY_query_param_uint64 (&uid),
index 994118bfa5f845d4bc05d673a4daf96968f942dd..7b04cc68a7e6d9ef17f223172f5df06e98651a82 100644 (file)
@@ -76,6 +76,11 @@ init_connection (struct Plugin *plugin)
   if (NULL == plugin->dbh)
     return GNUNET_SYSERR;
 
+  /* FIXME: PostgreSQL does not have unsigned integers! This is ok for the type column because
+   * we only test equality on it and can cast it to/from uint32_t. For repl, prio, and anonLevel
+   * we do math or inequality tests, so we can't handle the entire range of uint32_t.
+   * This will also cause problems for expiration times after 294247-01-10-04:00:54 UTC.
+   */
   ret =
       PQexec (plugin->dbh,
               "CREATE TABLE IF NOT EXISTS gn090 ("
@@ -869,9 +874,7 @@ postgres_plugin_get_expiration (void *cls,
  * @param cls our `struct Plugin *`
  * @param uid unique identifier of the datum
  * @param delta by how much should the priority
- *     change?  If priority + delta < 0 the
- *     priority should be set to 0 (never go
- *     negative).
+ *     change?
  * @param expire new expiration time should be the
  *     MAX of any existing expiration time and
  *     this value
@@ -881,16 +884,15 @@ postgres_plugin_get_expiration (void *cls,
 static void
 postgres_plugin_update (void *cls,
                        uint64_t uid,
-                       int delta,
+                       uint32_t delta,
                         struct GNUNET_TIME_Absolute expire,
                         PluginUpdateCont cont,
                        void *cont_cls)
 {
   struct Plugin *plugin = cls;
-  uint32_t idelta = delta;
   uint32_t oid = (uint32_t) uid;
   struct GNUNET_PQ_QueryParam params[] = {
-    GNUNET_PQ_query_param_uint32 (&idelta),
+    GNUNET_PQ_query_param_uint32 (&delta),
     GNUNET_PQ_query_param_absolute_time (&expire),
     GNUNET_PQ_query_param_uint32 (&oid),
     GNUNET_PQ_query_param_end
index 18a3aa4ac2a1357955deea2d34d713c1f2b6314b..028117d26dde0e34edcc9e609118ed1438c4b707 100644 (file)
@@ -291,6 +291,12 @@ database_setup (const struct GNUNET_CONFIGURATION_Handle *cfg,
          sq_prepare (plugin->dbh,
                      "SELECT 1 FROM sqlite_master WHERE tbl_name = 'gn090'",
                      &stmt));
+
+  /* FIXME: SQLite does not have unsigned integers! This is ok for the type column because
+   * we only test equality on it and can cast it to/from uint32_t. For repl, prio, and anonLevel
+   * we do math or inequality tests, so we can't handle the entire range of uint32_t.
+   * This will also cause problems for expiration times after 294247-01-10-04:00:54 UTC.
+   */
   if ((sqlite3_step (stmt) == SQLITE_DONE) &&
       (sqlite3_exec
        (plugin->dbh,
@@ -593,9 +599,7 @@ sqlite_plugin_put (void *cls,
  * @param cls the plugin context (state for this module)
  * @param uid unique identifier of the datum
  * @param delta by how much should the priority
- *     change?  If priority + delta < 0 the
- *     priority should be set to 0 (never go
- *     negative).
+ *     change?
  * @param expire new expiration time should be the
  *     MAX of any existing expiration time and
  *     this value
@@ -605,7 +609,7 @@ sqlite_plugin_put (void *cls,
 static void
 sqlite_plugin_update (void *cls,
                       uint64_t uid,
-                      int delta,
+                      uint32_t delta,
                       struct GNUNET_TIME_Absolute expire,
                       PluginUpdateCont cont,
                       void *cont_cls)
index fdd4fb157bf48021f41e81a23894890d486e353b..a1e03e8eec9320aceefd1ae2f421e917d1c1a65a 100644 (file)
@@ -164,9 +164,7 @@ template_plugin_get_expiration (void *cls, PluginDatumProcessor proc,
  * @param cls our "struct Plugin*"
  * @param uid unique identifier of the datum
  * @param delta by how much should the priority
- *     change?  If priority + delta < 0 the
- *     priority should be set to 0 (never go
- *     negative).
+ *     change?
  * @param expire new expiration time should be the
  *     MAX of any existing expiration time and
  *     this value
@@ -174,7 +172,7 @@ template_plugin_get_expiration (void *cls, PluginDatumProcessor proc,
  * @param cons_cls continuation closure
  */
 static void
-template_plugin_update (void *cls, uint64_t uid, int delta,
+template_plugin_update (void *cls, uint64_t uid, uint32_t delta,
                         struct GNUNET_TIME_Absolute expire,
                         PluginUpdateCont cont, void *cont_cls)
 {
index 71c69ffaf4910881692fde2c8f6404f4a5e73850..2295d4e7216d456b395174c186b41f1e19f389a9 100644 (file)
@@ -268,9 +268,7 @@ typedef void
  * @param cls closure
  * @param uid unique identifier of the datum
  * @param delta by how much should the priority
- *     change?  If priority + delta < 0 the
- *     priority should be set to 0 (never go
- *     negative).
+ *     change?
  * @param expire new expiration time should be the
  *     MAX of any existing expiration time and
  *     this value
@@ -280,7 +278,7 @@ typedef void
 typedef void
 (*PluginUpdate) (void *cls,
                 uint64_t uid,
-                int delta,
+                uint32_t delta,
                 struct GNUNET_TIME_Absolute expire,
                 PluginUpdateCont cont,
                 void *cont_cls);