Mesa (master): util/hash_table: do not leak u64 struct key
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Apr 29 11:44:20 UTC 2021
Module: Mesa
Branch: master
Commit: e532a47f76cc8d763e2534c61b27dce0f5bc86a0
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e532a47f76cc8d763e2534c61b27dce0f5bc86a0
Author: Juan A. Suarez Romero <jasuarez at igalia.com>
Date: Tue Apr 27 12:08:50 2021 +0200
util/hash_table: do not leak u64 struct key
For non 64bit devices the key stored in hash_table_u64 is wrapped in
hash_key_u64 structure, which is never free.
This commit fixes this issue by just removing the user-defined
`delete_function` parameter in hash_table_u64_{destroy,clear} (which
nobody is using) and using instead a delete function to free this
structure.
Fixes: 608257cf82f ("i965: Fix INTEL_DEBUG=bat")
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
Signed-off-by: Juan A. Suarez Romero <jasuarez at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10480>
---
src/freedreno/ir3/ir3_compiler_nir.c | 2 +-
src/gallium/drivers/lima/ir/pp/nir.c | 4 +-
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 2 +-
src/mesa/drivers/dri/i965/brw_batch.c | 4 +-
src/mesa/main/shader_query.cpp | 2 +-
src/mesa/main/shaderobj.c | 2 +-
src/mesa/main/texturebindless.c | 8 +--
src/microsoft/compiler/dxil_nir.c | 2 +-
src/panfrost/lib/decode_common.c | 2 +-
src/panfrost/midgard/mir_squeeze.c | 2 +-
src/util/fossilize_db.c | 2 +-
src/util/hash_table.c | 62 ++++++-----------------
src/util/hash_table.h | 6 +--
13 files changed, 34 insertions(+), 66 deletions(-)
diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c
index 243a55d5f19..4a8c4367046 100644
--- a/src/freedreno/ir3/ir3_compiler_nir.c
+++ b/src/freedreno/ir3/ir3_compiler_nir.c
@@ -2770,7 +2770,7 @@ emit_block(struct ir3_context *ctx, nir_block *nblock)
ctx->addr0_ht[i] = NULL;
}
- _mesa_hash_table_u64_destroy(ctx->addr1_ht, NULL);
+ _mesa_hash_table_u64_destroy(ctx->addr1_ht);
ctx->addr1_ht = NULL;
nir_foreach_instr (instr, nblock) {
diff --git a/src/gallium/drivers/lima/ir/pp/nir.c b/src/gallium/drivers/lima/ir/pp/nir.c
index a06a3286668..5d2d2282233 100644
--- a/src/gallium/drivers/lima/ir/pp/nir.c
+++ b/src/gallium/drivers/lima/ir/pp/nir.c
@@ -972,12 +972,12 @@ bool ppir_compile_nir(struct lima_fs_compiled_shader *prog, struct nir_shader *n
ppir_print_shader_db(nir, comp, debug);
- _mesa_hash_table_u64_destroy(comp->blocks, NULL);
+ _mesa_hash_table_u64_destroy(comp->blocks);
ralloc_free(comp);
return true;
err_out0:
- _mesa_hash_table_u64_destroy(comp->blocks, NULL);
+ _mesa_hash_table_u64_destroy(comp->blocks);
ralloc_free(comp);
return false;
}
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
index 7c3e99404f9..08ee7e7e5cf 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
@@ -636,7 +636,7 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
_mesa_hash_table_destroy(ws->bo_names, NULL);
_mesa_hash_table_destroy(ws->bo_handles, NULL);
- _mesa_hash_table_u64_destroy(ws->bo_vas, NULL);
+ _mesa_hash_table_u64_destroy(ws->bo_vas);
mtx_destroy(&ws->bo_handles_mutex);
mtx_destroy(&ws->vm32.mutex);
mtx_destroy(&ws->vm64.mutex);
diff --git a/src/mesa/drivers/dri/i965/brw_batch.c b/src/mesa/drivers/dri/i965/brw_batch.c
index 6800c8a9708..d4e27a95671 100644
--- a/src/mesa/drivers/dri/i965/brw_batch.c
+++ b/src/mesa/drivers/dri/i965/brw_batch.c
@@ -285,7 +285,7 @@ brw_batch_reset(struct brw_context *brw)
batch->state_base_address_emitted = false;
if (batch->state_batch_sizes)
- _mesa_hash_table_u64_clear(batch->state_batch_sizes, NULL);
+ _mesa_hash_table_u64_clear(batch->state_batch_sizes);
/* Always add workaround_bo which contains a driver identifier to be
* recorded in error states.
@@ -357,7 +357,7 @@ brw_batch_free(struct brw_batch *batch)
brw_bo_unreference(batch->batch.bo);
brw_bo_unreference(batch->state.bo);
if (batch->state_batch_sizes) {
- _mesa_hash_table_u64_destroy(batch->state_batch_sizes, NULL);
+ _mesa_hash_table_u64_destroy(batch->state_batch_sizes);
intel_batch_decode_ctx_finish(&batch->decoder);
}
}
diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
index 5e8515932aa..8c44d3eaeba 100644
--- a/src/mesa/main/shader_query.cpp
+++ b/src/mesa/main/shader_query.cpp
@@ -1951,7 +1951,7 @@ _mesa_create_program_resource_hash(struct gl_shader_program *shProg)
{
/* Rebuild resource hash. */
if (shProg->data->ProgramResourceHash)
- _mesa_hash_table_u64_destroy(shProg->data->ProgramResourceHash, NULL);
+ _mesa_hash_table_u64_destroy(shProg->data->ProgramResourceHash);
shProg->data->ProgramResourceHash = _mesa_hash_table_u64_create(shProg);
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index 3a3483c0182..27eab80b94a 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -358,7 +358,7 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
}
if (shProg->data && shProg->data->ProgramResourceHash) {
- _mesa_hash_table_u64_destroy(shProg->data->ProgramResourceHash, NULL);
+ _mesa_hash_table_u64_destroy(shProg->data->ProgramResourceHash);
shProg->data->ProgramResourceHash = NULL;
}
diff --git a/src/mesa/main/texturebindless.c b/src/mesa/main/texturebindless.c
index 939c01dd021..18f82c5d2ec 100644
--- a/src/mesa/main/texturebindless.c
+++ b/src/mesa/main/texturebindless.c
@@ -378,8 +378,8 @@ _mesa_init_resident_handles(struct gl_context *ctx)
void
_mesa_free_resident_handles(struct gl_context *ctx)
{
- _mesa_hash_table_u64_destroy(ctx->ResidentTextureHandles, NULL);
- _mesa_hash_table_u64_destroy(ctx->ResidentImageHandles, NULL);
+ _mesa_hash_table_u64_destroy(ctx->ResidentTextureHandles);
+ _mesa_hash_table_u64_destroy(ctx->ResidentImageHandles);
}
/**
@@ -397,10 +397,10 @@ void
_mesa_free_shared_handles(struct gl_shared_state *shared)
{
if (shared->TextureHandles)
- _mesa_hash_table_u64_destroy(shared->TextureHandles, NULL);
+ _mesa_hash_table_u64_destroy(shared->TextureHandles);
if (shared->ImageHandles)
- _mesa_hash_table_u64_destroy(shared->ImageHandles, NULL);
+ _mesa_hash_table_u64_destroy(shared->ImageHandles);
mtx_destroy(&shared->HandlesMutex);
}
diff --git a/src/microsoft/compiler/dxil_nir.c b/src/microsoft/compiler/dxil_nir.c
index 6659867d802..89ddd9c3f6b 100644
--- a/src/microsoft/compiler/dxil_nir.c
+++ b/src/microsoft/compiler/dxil_nir.c
@@ -1462,6 +1462,6 @@ dxil_nir_create_bare_samplers(nir_shader *nir)
bool progress = nir_shader_instructions_pass(nir, redirect_sampler_derefs,
nir_metadata_block_index | nir_metadata_dominance | nir_metadata_loop_analysis, sampler_to_bare);
- _mesa_hash_table_u64_destroy(sampler_to_bare, NULL);
+ _mesa_hash_table_u64_destroy(sampler_to_bare);
return progress;
}
diff --git a/src/panfrost/lib/decode_common.c b/src/panfrost/lib/decode_common.c
index 55d6e459eca..1b197b96db7 100644
--- a/src/panfrost/lib/decode_common.c
+++ b/src/panfrost/lib/decode_common.c
@@ -214,7 +214,7 @@ pandecode_next_frame(void)
void
pandecode_close(void)
{
- _mesa_hash_table_u64_destroy(mmap_table, NULL);
+ _mesa_hash_table_u64_destroy(mmap_table);
util_dynarray_fini(&ro_mappings);
pandecode_dump_file_close();
}
diff --git a/src/panfrost/midgard/mir_squeeze.c b/src/panfrost/midgard/mir_squeeze.c
index 10fa9a6eb97..aa230f836db 100644
--- a/src/panfrost/midgard/mir_squeeze.c
+++ b/src/panfrost/midgard/mir_squeeze.c
@@ -83,5 +83,5 @@ mir_squeeze_index(compiler_context *ctx)
ctx->blend_input = find_or_allocate_temp(ctx, map, ctx->blend_input);
ctx->blend_src1 = find_or_allocate_temp(ctx, map, ctx->blend_src1);
- _mesa_hash_table_u64_destroy(map, NULL);
+ _mesa_hash_table_u64_destroy(map);
}
diff --git a/src/util/fossilize_db.c b/src/util/fossilize_db.c
index 292389b44a4..b77d7bcfa9b 100644
--- a/src/util/fossilize_db.c
+++ b/src/util/fossilize_db.c
@@ -304,7 +304,7 @@ foz_destroy(struct foz_db *foz_db)
}
if (foz_db->mem_ctx) {
- _mesa_hash_table_u64_destroy(foz_db->index_db, NULL);
+ _mesa_hash_table_u64_destroy(foz_db->index_db);
ralloc_free(foz_db->mem_ctx);
simple_mtx_destroy(&foz_db->mtx);
}
diff --git a/src/util/hash_table.c b/src/util/hash_table.c
index 079427bd951..a0cebdb250b 100644
--- a/src/util/hash_table.c
+++ b/src/util/hash_table.c
@@ -768,65 +768,35 @@ _mesa_hash_table_u64_create(void *mem_ctx)
return ht;
}
-void
-_mesa_hash_table_u64_clear(struct hash_table_u64 *ht,
- void (*delete_function)(struct hash_entry *entry))
+static void
+_mesa_hash_table_u64_delete_key(struct hash_entry *entry)
{
- if (!ht)
+ if (sizeof(void *) == 8)
return;
- if (ht->deleted_key_data) {
- if (delete_function) {
- struct hash_table *table = ht->table;
- struct hash_entry entry;
-
- /* Create a fake entry for the delete function. */
- 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;
+ struct hash_key_u64 *_key = (struct hash_key_u64 *)entry->key;
- delete_function(&entry);
- }
- ht->deleted_key_data = NULL;
- }
-
- if (ht->freed_key_data) {
- if (delete_function) {
- struct hash_table *table = ht->table;
- struct hash_entry entry;
-
- /* Create a fake entry for the delete function. */
- 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;
+ if (_key)
+ free(_key);
+}
- delete_function(&entry);
- }
- ht->freed_key_data = NULL;
- }
+void
+_mesa_hash_table_u64_clear(struct hash_table_u64 *ht)
+{
+ if (!ht)
+ return;
- _mesa_hash_table_clear(ht->table, delete_function);
+ _mesa_hash_table_clear(ht->table, _mesa_hash_table_u64_delete_key);
}
void
-_mesa_hash_table_u64_destroy(struct hash_table_u64 *ht,
- void (*delete_function)(struct hash_entry *entry))
+_mesa_hash_table_u64_destroy(struct hash_table_u64 *ht)
{
if (!ht)
return;
- _mesa_hash_table_u64_clear(ht, delete_function);
- _mesa_hash_table_destroy(ht->table, delete_function);
+ _mesa_hash_table_u64_clear(ht);
+ _mesa_hash_table_destroy(ht->table, NULL);
free(ht);
}
diff --git a/src/util/hash_table.h b/src/util/hash_table.h
index ff3b3bef576..b61721a5df8 100644
--- a/src/util/hash_table.h
+++ b/src/util/hash_table.h
@@ -172,8 +172,7 @@ struct hash_table_u64 *
_mesa_hash_table_u64_create(void *mem_ctx);
void
-_mesa_hash_table_u64_destroy(struct hash_table_u64 *ht,
- void (*delete_function)(struct hash_entry *entry));
+_mesa_hash_table_u64_destroy(struct hash_table_u64 *ht);
void
_mesa_hash_table_u64_insert(struct hash_table_u64 *ht, uint64_t key,
@@ -186,8 +185,7 @@ void
_mesa_hash_table_u64_remove(struct hash_table_u64 *ht, uint64_t key);
void
-_mesa_hash_table_u64_clear(struct hash_table_u64 *ht,
- void (*delete_function)(struct hash_entry *entry));
+_mesa_hash_table_u64_clear(struct hash_table_u64 *ht);
#ifdef __cplusplus
} /* extern C */
More information about the mesa-commit
mailing list