Project

General

Profile

Actions

Bug #22383

closed

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) 2 days ago. Updated 2 days ago.

Status:
Closed
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) 2 days 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) 2 days 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) 2 days ago Actions #5 [ruby-core:126857]

Sorry, confusing with [Bug #22382].

Updated by rwstauner (Randy Stauner) 2 days ago Actions #6

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

Updated by Anonymous 2 days ago Actions #7

  • Status changed from Open to Closed

Applied in changeset git|57213d44ce7b1a31fc9648e9cd5eb0c4507f4a49.


[Bug #22383] Fix inverted STR_SHARED check in rb_str_tmp_frozen_release

45a2c95d0f7184c9cd64ddd26699af31bea8675d 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

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 code then read aux.shared from strings
that are not shared, where the union holds aux.capa.

This should be backported to 4.0

Actions

Also available in: PDF Atom