Mesa (master): util/hash_table: Assert that keys are not reserved pointers

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jun 6 00:28:02 UTC 2019


Module: Mesa
Branch: master
Commit: b38dab101ca7e0896255dccbd85fd510c47d84d1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b38dab101ca7e0896255dccbd85fd510c47d84d1

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Wed Jun  5 17:30:47 2019 -0500

util/hash_table: 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 <kenneth at whitecape.org>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira at intel.com>
Reviewed-by: Eric Anholt <eric at anholt.net>

---

 src/util/hash_table.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/util/hash_table.c b/src/util/hash_table.c
index 74d03aa60fb..a764fabbf05 100644
--- a/src/util/hash_table.c
+++ b/src/util/hash_table.c
@@ -98,6 +98,12 @@ static const struct {
    ENTRY(2147483648ul, 2362232233ul, 2362232231ul )
 };
 
+static inline bool
+key_pointer_is_reserved(const struct hash_table *ht, const void *key)
+{
+   return key == NULL || key == ht->deleted_key;
+}
+
 static int
 entry_is_free(const struct hash_entry *entry)
 {
@@ -250,6 +256,8 @@ _mesa_hash_table_set_deleted_key(struct hash_table *ht, const void *deleted_key)
 static struct hash_entry *
 hash_table_search(struct hash_table *ht, uint32_t hash, const void *key)
 {
+   assert(!key_pointer_is_reserved(ht, key));
+
    uint32_t size = ht->size;
    uint32_t start_hash_address = util_fast_urem32(hash, size, ht->size_magic);
    uint32_t double_hash = 1 + util_fast_urem32(hash, ht->rehash,
@@ -366,7 +374,7 @@ hash_table_insert(struct hash_table *ht, uint32_t hash,
 {
    struct hash_entry *available_entry = NULL;
 
-   assert(key != NULL);
+   assert(!key_pointer_is_reserved(ht, key));
 
    if (ht->entries >= ht->max_entries) {
       _mesa_hash_table_rehash(ht, ht->size_index + 1);




More information about the mesa-commit mailing list