diff options
author | John Hawthorn <[email protected]> | 2025-06-15 01:18:22 -0700 |
---|---|---|
committer | John Hawthorn <[email protected]> | 2025-06-17 15:32:53 -0700 |
commit | a7dc515c1df34c9952401cfb17d52266b7cf5534 () | |
tree | 15580052d0f014a68817bfa295ec3e5ca713e0f4 | |
parent | e3ec101cc21613550ef87b7bd8432a69c7e639de (diff) |
Fix too early writebarrier in tally_up
After returning from the callback in st_update is the point that the hash table may be resized, which could trigger a GC and mark the table being used for the tally. RUBY_GC_LIBRARY=wbcheck WBCHECK_VERIFY_AFTER_WB=1 ./miniruby -e '(0...100).map(&:to_s).tally'
Notes: Merged: https://.com/ruby/ruby/pull/13629
-rw-r--r-- | enum.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -1215,14 +1215,15 @@ tally_up(st_data_t *group, st_data_t *value, st_data_t arg, int existing) RB_OBJ_WRITTEN(hash, Qundef, tally); } *value = (st_data_t)tally; - if (!SPECIAL_CONST_P(*group)) RB_OBJ_WRITTEN(hash, Qundef, *group); return ST_CONTINUE; } static VALUE rb_enum_tally_up(VALUE hash, VALUE group) { - rb_hash_stlike_update(hash, group, tally_up, (st_data_t)hash); return hash; } |