Project

General

Profile

Actions

Bug #22383

open

Fix inverted `STR_SHARED` check in `rb_str_tmp_frozen_release`

Bug #22383: Fix inverted `STR_SHARED` check in `rb_str_tmp_frozen_release`

Added by rwstauner (Randy Stauner) about 8 hours ago. Updated about 7 hours ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:126852]

Description

https://github.com/ruby/ruby/commit/45a2c95d0f7184c9cd64ddd26699af31bea8675d#diff-430d86fdb6c4a558ab0f1b6648bbfae1720e8bde84f026e95a52740014752040R1914

mistakenly rewrote

FL_TEST_RAW(orig, STR_SHARED) && !FL_TEST_RAW(orig, STR_TMPLOCK|RUBY_FL_FREEZE)

as

FL_TEST_RAW(orig, STR_SHARED | STR_TMPLOCK) == STR_TMPLOCK && !OBJ_FROZEN_RAW(orig)

requiring orig to not be shared, the opposite of the original
condition. orig always shares the buffer with tmp here, so the buffer
was never given back and the string stayed shared until its next
modification copied it.
The next line of code then reads aux.shared from strings
that are not shared, where the union holds aux.capa.

Updated by nobu (Nobuyoshi Nakada) about 7 hours ago Actions #3 [ruby-core:126855]

  • Backport changed from 3.3: UNKNOWN, 3.4: UNKNOWN, 4.0: REQUIRED to 3.3: REQUIRED, 3.4: REQUIRED, 4.0: REQUIRED

With class Ractor alias join take end unless Ractor.method_defined?(:join), it reproduced on 3.3 an 3.4.

Updated by rwstauner (Randy Stauner) about 7 hours ago Actions #4 [ruby-core:126856]

With class Ractor alias join take end unless Ractor.method_defined?(:join), it reproduced on 3.3 an 3.4.

What reproduces?
I do have a few related fixes coming in another PR but this particular condition is still

else if (FL_TEST_RAW(orig, STR_SHARED) &&
        !FL_TEST_RAW(orig, STR_TMPLOCK|RUBY_FL_FREEZE)) {

in 3.4, it only got changed in the linked commit which is on 4.0

Updated by nobu (Nobuyoshi Nakada) about 7 hours ago Actions #5 [ruby-core:126857]

Sorry, confusing with [Bug #22382].

Actions

Also available in: PDF Atom