Bug #20045


`TestDir#test_home` fails on i686

Added by vo.x (Vit Ondruch) 8 months ago. Updated 7 months ago.

Target version:
ruby -v:
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [i686-linux]


This is followup to #19147. Testing on Fedora 38 and Fedora Rawhide, we are facing this test failure:

$ tar xf build/SOURCES/ruby-3.2.2.tar.xz
$ cd ruby-3.2.2/
$ ./configure && make

... snip ...

Configuration summary for ruby version 3.2.2

   * Installation prefix: /usr/local
   * exec prefix:         ${prefix}
   * arch:                i686-linux
   * site arch:           ${arch}
   * RUBY_BASE_NAME:      ruby
   * ruby lib prefix:     ${libdir}/${RUBY_BASE_NAME}
   * site libraries path: ${rubylibprefix}/${sitearch}
   * vendor path:         ${rubylibprefix}/vendor_ruby
   * target OS:           linux
   * compiler:            gcc
   * with thread:         pthread
   * with coroutine:      x86
   * enable shared libs:  no
   * dynamic library ext: so
   * CFLAGS:              ${optflags} ${debugflags} ${warnflags}
   * LDFLAGS:             -L. -fstack-protector-strong -rdynamic -Wl,-export-dynamic
   * DLDFLAGS:            -Wl,--compress-debug-sections=zlib
   * optflags:            -O3 -fno-fast-math
   * debugflags:          -ggdb3
   * warnflags:           -Wall -Wextra -Wdeprecated-declarations -Wdiv-by-zero -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wold-style-definition \
                          -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat \
                          -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef
   * strip command:       strip -S -x
   * install doc:         rdoc
   * MJIT support:        yes
   * YJIT support:        no
   * man page type:       doc


... snip ...

$ LANG=C make test-all 'TESTS=-v -n /TestDir#test_home/'
config.status: creating ruby-runner.h
generating i686-linux-fake.rb
i686-linux-fake.rb updated
Run options: 
  "--ruby=./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems"

# Running tests:

[1/0] TestDir#test_home = 0.00 s

  1) Error:
RuntimeError: can't set length of shared string
    /builddir/ruby-3.2.2/test/ruby/test_dir.rb:557:in `expand_path'
    /builddir/ruby-3.2.2/test/ruby/test_dir.rb:557:in `block in test_home'

Finished tests in 4.164691s, 0.2401 tests/s, 1.6808 assertions/s.
1 tests, 7 assertions, 0 failures, 1 errors, 0 skips

ruby -v: ruby 3.2.2 (2023-03-30 revision e51014f9c0) [i686-linux]
make: *** [ yes-test-all] Error 1

Please note that having the C locale is essential. The test passes just fine with e.g. C.UTF-8 locale.

We were able to reduce the test case to the following:

$ whoami

$ echo 'File.expand_path("~mockbuild")' > test.rb

$ LANG=C RUBYLIB=/builddir/ruby-3.2.2/.ext/i686-linux LD_LIBRARY_PATH=. ./ruby --disable-gems test.rb
test.rb:1:in `expand_path': can't set length of shared string (RuntimeError)
	from test.rb:1:in `<main>'

As I said earlier, the LANG=C is essential as well as the RUBYLIB=/builddir/ruby-3.2.2/.ext/i386-linux. Adding the path to RUBYLIB enables Ruby to load the following libraries:


And that makes the difference. Also, the File.expand_path("~mockbuild") must be in some file, replacing this by -e 'File.expand_path("~mockbuild")' does not reproduce the issue.

We also believe that this was introduced by, specifically by git|5246f4027ec574e77809845e1b1f7822cc2a5cef and fixed in master by git|b4571097df4a6bd848f1195026d82a92f3a7f9d8.

Unfortunately, we were not able to discover what is the mechanism behind this, why this depends on locale, why the test must be in file, why the string is shared etc. But I hope we have provided enough details for someone else more knowledgeable.

Some background for this issue is also available here:

Updated by vo.x (Vit Ondruch) 8 months ago

BTW TestFileExhaustive#test_expand_path_for_existent_username still fails as well, but that is likely the same issue:

$ LANG=C make test-all 'TESTS=-v -n /TestFileExhaustive#test_expand_path_for_existent_username/'
Run options: 
  "--ruby=./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems"

# Running tests:

[1/0] TestFileExhaustive#test_expand_path_for_existent_username = 0.04 s

  1) Error:
RuntimeError: can't set length of shared string
    /builddir/ruby-3.2.2/test/ruby/test_file_exhaustive.rb:1122:in `expand_path'
    /builddir/ruby-3.2.2/test/ruby/test_file_exhaustive.rb:1122:in `test_expand_path_for_existent_username'

Finished tests in 4.007503s, 0.2495 tests/s, 0.4991 assertions/s.
1 tests, 2 assertions, 0 failures, 1 errors, 0 skips

ruby -v: ruby 3.2.2 (2023-03-30 revision e51014f9c0) [i686-linux]
make: *** [ yes-test-all] Error 1

Updated by mame (Yusuke Endoh) 7 months ago

  • Status changed from Open to Assigned
  • Assignee set to jemmai (Jemma Issroff)

@jemmai (Jemma Issroff) Could you take a look at this?


Also available in: Atom PDF