From fe4f6e8cedfa8d0a57b0247727fc4849d38c2f3a Mon Sep 17 00:00:00 2001 From: David Barksdale Date: Mon, 20 Feb 2017 13:08:08 -0600 Subject: [PATCH] Restrict update to positive priority deltas 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 | 2 +- src/datastore/plugin_datastore_heap.c | 11 +++++------ src/datastore/plugin_datastore_mysql.c | 9 +++------ src/datastore/plugin_datastore_postgres.c | 14 ++++++++------ src/datastore/plugin_datastore_sqlite.c | 12 ++++++++---- src/datastore/plugin_datastore_template.c | 6 ++---- src/include/gnunet_datastore_plugin.h | 6 ++---- 7 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/datastore/gnunet-service-datastore.c b/src/datastore/gnunet-service-datastore.c index 6f1bd2b6d..445c3576e 100644 --- a/src/datastore/gnunet-service-datastore.c +++ b/src/datastore/gnunet-service-datastore.c @@ -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); diff --git a/src/datastore/plugin_datastore_heap.c b/src/datastore/plugin_datastore_heap.c index 977d599d2..199c03a50 100644 --- a/src/datastore/plugin_datastore_heap.c +++ b/src/datastore/plugin_datastore_heap.c @@ -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); diff --git a/src/datastore/plugin_datastore_mysql.c b/src/datastore/plugin_datastore_mysql.c index d76b4ccb4..1067064aa 100644 --- a/src/datastore/plugin_datastore_mysql.c +++ b/src/datastore/plugin_datastore_mysql.c @@ -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), diff --git a/src/datastore/plugin_datastore_postgres.c b/src/datastore/plugin_datastore_postgres.c index 994118bfa..7b04cc68a 100644 --- a/src/datastore/plugin_datastore_postgres.c +++ b/src/datastore/plugin_datastore_postgres.c @@ -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 diff --git a/src/datastore/plugin_datastore_sqlite.c b/src/datastore/plugin_datastore_sqlite.c index 18a3aa4ac..028117d26 100644 --- a/src/datastore/plugin_datastore_sqlite.c +++ b/src/datastore/plugin_datastore_sqlite.c @@ -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) diff --git a/src/datastore/plugin_datastore_template.c b/src/datastore/plugin_datastore_template.c index fdd4fb157..a1e03e8ee 100644 --- a/src/datastore/plugin_datastore_template.c +++ b/src/datastore/plugin_datastore_template.c @@ -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) { diff --git a/src/include/gnunet_datastore_plugin.h b/src/include/gnunet_datastore_plugin.h index 71c69ffaf..2295d4e72 100644 --- a/src/include/gnunet_datastore_plugin.h +++ b/src/include/gnunet_datastore_plugin.h @@ -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); -- 2.25.1