mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-22 05:20:37 +02:00
util/hash_table: Fix hashing in clears on 32-bit
Some hash functions (eg. key_u64_hash) will attempt to dereference the key, causing an invalid access when passed DELETED_KEY_VALUE (0x1) or FREED_KEY_VALUE (0x0). When in 32-bit arch a 64-bit key value doesn't fit into a pointer, so hash_table_u64 internally use a pointer to a struct containing the 64-bit key value. Fix _mesa_hash_table_u64_clear() to handle the 32-bit case by creating a temporary hash_key_u64 to pass to the hash function. Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Suggested-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Cc: Samuel Pitoiset <samuel.pitoiset@gmail.com> Cc: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
parent
aba57b11ee
commit
5804d75b9c
1 changed files with 12 additions and 2 deletions
|
|
@ -667,7 +667,12 @@ _mesa_hash_table_u64_clear(struct hash_table_u64 *ht,
|
|||
struct hash_entry entry;
|
||||
|
||||
/* Create a fake entry for the delete function. */
|
||||
entry.hash = table->key_hash_function(table->deleted_key);
|
||||
if (sizeof(void *) == 8) {
|
||||
entry.hash = table->key_hash_function(table->deleted_key);
|
||||
} else {
|
||||
struct hash_key_u64 _key = { .value = (uintptr_t)table->deleted_key };
|
||||
entry.hash = table->key_hash_function(&_key);
|
||||
}
|
||||
entry.key = table->deleted_key;
|
||||
entry.data = ht->deleted_key_data;
|
||||
|
||||
|
|
@ -682,7 +687,12 @@ _mesa_hash_table_u64_clear(struct hash_table_u64 *ht,
|
|||
struct hash_entry entry;
|
||||
|
||||
/* Create a fake entry for the delete function. */
|
||||
entry.hash = table->key_hash_function(uint_key(FREED_KEY_VALUE));
|
||||
if (sizeof(void *) == 8) {
|
||||
entry.hash = table->key_hash_function(uint_key(FREED_KEY_VALUE));
|
||||
} else {
|
||||
struct hash_key_u64 _key = { .value = (uintptr_t)FREED_KEY_VALUE };
|
||||
entry.hash = table->key_hash_function(&_key);
|
||||
}
|
||||
entry.key = uint_key(FREED_KEY_VALUE);
|
||||
entry.data = ht->freed_key_data;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue