From fdfbb3ad20b5ed9ffbb66d671eb85ddf82f5d9cf Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 2 Oct 2025 16:26:03 +0200 Subject: [PATCH] Fix (unreported) memleak in IDHash when computing the hash fails. Code would early-return on failure, forgetting to free the xxhash state. Use the `BLI_SCOPED_DEFER` util to ensure the state is always properly freed when it gets out of scope. Pull Request: https://projects.blender.org/blender/blender/pulls/147189 --- source/blender/blenkernel/intern/id_hash.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/id_hash.cc b/source/blender/blenkernel/intern/id_hash.cc index 22e75646bc7..7b4517ebc4c 100644 --- a/source/blender/blenkernel/intern/id_hash.cc +++ b/source/blender/blenkernel/intern/id_hash.cc @@ -155,6 +155,7 @@ static void compute_deep_hash_recursive(const Main &bmain, } XXH3_state_t *hash_state = XXH3_createState(); + BLI_SCOPED_DEFER([&hash_state]() -> void { XXH3_freeState(hash_state); }) XXH3_128bits_reset(hash_state); XXH3_128bits_update(hash_state, &*id_shallow_hash, sizeof(XXH128_hash_t)); @@ -208,7 +209,6 @@ static void compute_deep_hash_recursive(const Main &bmain, } IDHash new_deep_hash; const XXH128_hash_t new_deep_hash_xxh128 = XXH3_128bits_digest(hash_state); - XXH3_freeState(hash_state); static_assert(sizeof(IDHash) == sizeof(XXH128_hash_t)); memcpy(new_deep_hash.data, &new_deep_hash_xxh128, sizeof(IDHash)); r_hashes.add(&id, new_deep_hash);