summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2019-06-05 16:56:20 -0500
committerJason Ekstrand <[email protected]>2019-06-06 00:27:53 +0000
commit8306dabc03c9a030cacd078b56446e6548224a23 (patch)
tree7ebf83403956268d5ba78adee5eee5e149e213d5
parent7a18ce0b9119898b6d58b8e76495a40a9fe71765 (diff)
util/set: Assert that keys are not reserved pointers
If we insert a NULL key, it will appear to succeed but will mess up entry counting. Similar errors can occur if someone accidentally inserts the deleted key. The later is highly unlikely but technically possible so we should guard against it too. Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Caio Marcelo de Oliveira Filho <[email protected]> Reviewed-by: Eric Anholt <[email protected]>
-rw-r--r--src/util/set.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/util/set.c b/src/util/set.c
index 4788b94324a..5173c24474c 100644
--- a/src/util/set.c
+++ b/src/util/set.c
@@ -92,6 +92,12 @@ static const struct {
ENTRY(2147483648ul, 2362232233ul, 2362232231ul )
};
+static inline bool
+key_pointer_is_reserved(const void *key)
+{
+ return key == NULL || key == deleted_key;
+}
+
static int
entry_is_free(struct set_entry *entry)
{
@@ -214,6 +220,8 @@ _mesa_set_clear(struct set *set, void (*delete_function)(struct set_entry *entry
static struct set_entry *
set_search(const struct set *ht, uint32_t hash, const void *key)
{
+ assert(!key_pointer_is_reserved(key));
+
uint32_t size = ht->size;
uint32_t start_address = util_fast_urem32(hash, size, ht->size_magic);
uint32_t double_hash = util_fast_urem32(hash, ht->rehash,
@@ -337,6 +345,8 @@ set_search_or_add(struct set *ht, uint32_t hash, const void *key, bool *found)
{
struct set_entry *available_entry = NULL;
+ assert(!key_pointer_is_reserved(key));
+
if (ht->entries >= ht->max_entries) {
set_rehash(ht, ht->size_index + 1);
} else if (ht->deleted_entries + ht->entries >= ht->max_entries) {