summaryrefslogtreecommitdiff
path: root/weakmap.c
diff options
context:
space:
mode:
authorPeter Zhu <[email protected]>2024-10-23 12:53:32 -0400
committerPeter Zhu <[email protected]>2024-10-24 09:45:29 -0400
commitc1ca331cf44875b2238452cc6cd73bc4474a8301 (patch)
tree0b6bb58d4c9d03b5c163e37262b3a1de8e76e948 /weakmap.c
parent4755d28f9b2aba730563547ae44abcc5af0bc46f (diff)
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.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/11944
Diffstat (limited to 'weakmap.c')
-rw-r--r--weakmap.c10
1 files changed, 9 insertions, 1 deletions
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