diff options
author | David Barksdale <amatus@amat.us> | 2017-02-20 13:08:08 -0600 |
---|---|---|
committer | David Barksdale <amatus@amat.us> | 2017-02-20 13:11:19 -0600 |
commit | fe4f6e8cedfa8d0a57b0247727fc4849d38c2f3a (patch) | |
tree | cbcbc99a93ec8f466426190a340cc46f54d2641e /src | |
parent | f553963d649374a75cc5a6e57df39d83565eb913 (diff) |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/datastore/gnunet-service-datastore.c | 2 | ||||
-rw-r--r-- | src/datastore/plugin_datastore_heap.c | 11 | ||||
-rw-r--r-- | src/datastore/plugin_datastore_mysql.c | 9 | ||||
-rw-r--r-- | src/datastore/plugin_datastore_postgres.c | 14 | ||||
-rw-r--r-- | src/datastore/plugin_datastore_sqlite.c | 12 | ||||
-rw-r--r-- | src/datastore/plugin_datastore_template.c | 6 | ||||
-rw-r--r-- | 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 6f1bd2b6d9..445c3576e5 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 977d599d20..199c03a507 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 d76b4ccb47..1067064aa1 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 994118bfa5..7b04cc68a7 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 18a3aa4ac2..028117d26d 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 fdd4fb157b..a1e03e8eec 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 71c69ffaf4..2295d4e721 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); |