
Issue #21172 has been updated by nagachika (Tomoyuki Chikanaga). Backport changed from 3.1: WONTFIX, 3.2: WONTFIX, 3.3: REQUIRED, 3.4: REQUIRED to 3.1: WONTFIX, 3.2: WONTFIX, 3.3: DONE, 3.4: REQUIRED ruby_3_3 commit:726bff43b462d2a1b0bc93299cf031202f7fe7a1 merged revision(s) commit:c224ca4feaff20cab03d76439bcbfb35d4e2f6b1. ---------------------------------------- Bug #21172: Race condition in `register_fstring` https://bugs.ruby-lang.org/issues/21172#change-112351 * Author: byroot (Jean Boussier) * Status: Closed * Backport: 3.1: WONTFIX, 3.2: WONTFIX, 3.3: DONE, 3.4: REQUIRED ---------------------------------------- This is a rare bug with very low criticality, but it can cause occasional CI failures. I leave it to branch maintainers to decide if it's worth backporting or not. ### Timeline - A `"foo" oid=1` string is interned. - `"foo" oid=1` is no longer referenced and will be swept in the future. - Another `"foo" oid=2` string is interned. - `register_fstring` finds `"foo" oid=1`, but since it is about to be swept, removes it from `fstring_table` and insert `"foo" oid=2` instead. - `"foo" oid=1` is swept, since it has the `RSTRING_FSTR` flag, a `st_delete` is issued in `fstring_table` which removes `"foo" oid=2`. Unfortunately, I couldn't come up with a minimal reproduction for this, but it did reproduce consistently with a large amount of tests and a very specific seed. ### Consequence This has little to no consequence on real world code. It just breaks a few ruby tests that is attempting to ensure some strings were interned. Example: ``` 1) Failure: JSONParserTest#test_freeze [/tmp/ruby/src/trunk/test/json/json_parser_test.rb:361]: Expected "foo" (oid=416) to be the same as "foo" (oid=424). make: *** [uncommon.mk:953: yes-test-all] Error 1 ``` -- https://bugs.ruby-lang.org/