From c1ca331cf44875b2238452cc6cd73bc4474a8301 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 23 Oct 2024 12:53:32 -0400 Subject: [PATCH] Fix potential issue in wmap_cmp for dead entries wmap_cmp will always return true for dead entries since dead entries have a Qundef value. When the keys have a hash collision, this may cause the wrong entry to be returned. This commit changes wmap_cmp to compare by weakmap_entry pointers when the entry is dead. --- weakmap.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/weakmap.c b/weakmap.c index c5e6ca67b0..fcf280183f 100644 --- a/weakmap.c +++ b/weakmap.c @@ -221,7 +221,15 @@ static const rb_data_type_t weakmap_type = { static int wmap_cmp(st_data_t x, st_data_t y) { - return *(VALUE *)x != *(VALUE *)y; + VALUE x_obj = *(VALUE *)x; + VALUE y_obj = *(VALUE *)y; + + if (!wmap_live_p(x_obj) && !wmap_live_p(y_obj)) { + return x != y; + } + else { + return x_obj != y_obj; + } } static st_index_t