Skip to content

ruby-vips seg fault only when running rails tests in parallel #429

Description

@curi

When I run tests for my rails project with parallelization enabled, ruby-vips seg faults. It works without parallelization or if I use image magick for the same image processing operations. I don't currently have a clean reproduction to share. I'm not sure what could cause this, if the issue is in my code or test data, the ruby-vips library, or vips itself. I don't know if this will affect my upcoming production debian server that will run multiple puma workers.

macOS Tahoe 26.1, M1 chip, ruby 3.4.7, rails 8.1.1, ruby-vips 2.3.0, vips 8.16.1 via homebrew.

The crash is in:

/Users/curi/.gem/ruby/3.4.7/gems/ruby-vips-2.3.0/lib/vips/image.rb:284, specifically:

loader = Vips.vips_foreign_find_load filename

from:

    def self.new_from_file name, **opts
      # very common, and Vips::vips_filename_get_filename will segv if we
      # pass this
      raise Vips::Error, "filename is nil" if name.nil?

      filename = Vips.p2str(Vips.vips_filename_get_filename(name))
      option_string = Vips.p2str(Vips.vips_filename_get_options(name))
      loader = Vips.vips_foreign_find_load filename
      raise Vips::Error if loader.nil?

      Operation.call loader, [filename], opts, option_string
    end

Here's part of a crash log:

981c00000-982000000 rw-
982000000-982400000 rw-
982400000-982800000 rw-
982800000-982c00000 rw-
982c00000-983000000 rw-
983000000-983400000 rw-
983400000-c7e000000 ---
c96000000-c96400000 rw-
c96400000-c96800000 rw-
c96800000-c96b00000 rw-
c96c00000-c96f00000 rw-
c97000000-c97600000 rw-
c97800000-c97c00000 rw-
c97c00000-c98000000 rw-
c98000000-c98774000 rw-
fc0000000-1000000000 ---
1000000000-7000000000 ---
[IMPORTANT]
Don't forget to include the Crash Report log file under
DiagnosticReports directory in bug reports.

./Users/curi/.gem/ruby/3.4.7/gems/ruby-vips-2.3.0/lib/vips/image.rb:284: [BUG] Segmentation fault at 0x0000000122c50853
ruby 3.4.7 (2025-10-08 revision 7a5688e2a2) +YJIT +PRISM [arm64-darwin25]

-- Crash Report log information --------------------------------------------
   See Crash Report log file in one of the following locations:             
     * ~/Library/Logs/DiagnosticReports                                     
     * /Library/Logs/DiagnosticReports                                      
   for more details.                                                        
Don't forget to include the above Crash Report log file in bug reports.     

-- Control frame information -----------------------------------------------
c:0034 p:---- s:0184 e:000183 CFUNC  :vips_foreign_find_load
c:0033 p:0044 s:0179 e:000178 METHOD /Users/curi/.gem/ruby/3.4.7/gems/ruby-vips-2.3.0/lib/vips/image.rb:284
c:0032 p:0006 s:0170 e:000169 METHOD /Users/curi/w/c/redacted/app/models/image_processor_vips.rb:13
c:0031 p:0024 s:0163 e:000162 METHOD /Users/curi/w/c/redacted/app/models/image_processor_base.rb:17 [FINISH]
c:0030 p:---- s:0155 e:000154 CFUNC  :new
c:0029 p:0047 s:0148 e:000147 METHOD /Users/curi/w/c/redacted/app/models/image_processor_base.rb:30
c:0028 p:0010 s:0139 e:000138 BLOCK  /Users/curi/w/c/redacted/test/models/image_processor_test.rb:285
c:0027 p:0012 s:0127 e:000126 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:95
c:0026 p:0002 s:0124 e:000123 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:191
c:0025 p:0004 s:0119 e:000118 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:90
c:0024 p:0008 s:0116 e:000115 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:382
c:0023 p:0004 s:0111 e:000110 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:89
c:0022 p:0006 s:0107 e:000106 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/executor/test_helper.rb:5
c:0021 p:0012 s:0104 e:000103 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/execution_wrapper.rb:104
c:0020 p:0009 s:0099 e:000098 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/executor/test_helper.rb:5
c:0019 p:0008 s:0094 e:000093 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:1223
c:0018 p:0008 s:0087 e:000086 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:50
c:0017 p:0022 s:0084 E:002470 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:487
c:0016 p:0014 s:0076 e:000075 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:474
c:0015 p:0049 s:0070 E:001f68 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:49
c:0014 p:0011 s:0061 e:000060 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:38
c:0013 p:0043 s:0056 e:000055 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:27 [FINISH]
c:0012 p:---- s:0053 e:000052 CFUNC  :fork
c:0011 p:0004 s:0049 e:000048 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:15
c:0010 p:0011 s:0045 e:000044 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization.rb:50 [FINISH]
c:0009 p:---- s:0041 e:000040 IFUNC 
c:0008 p:0024 s:0038 e:000036 METHOD <internal:numeric>:257 [FINISH]
c:0007 p:---- s:0032 e:000031 CFUNC  :each
c:0006 p:---- s:0029 e:000028 CFUNC  :map
c:0005 p:0012 s:0025 e:000024 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization.rb:49
c:0004 p:0023 s:0021 e:000020 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelize_executor.rb:19
c:0003 p:0128 s:0017 e:000016 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:298
c:0002 p:0045 s:0008 E:002300 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:85 [FINISH]
c:0001 p:0000 s:0003 E:000be0 DUMMY  [FINISH]

-- Ruby level backtrace information ----------------------------------------
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:85:in 'block in autorun'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:298:in 'run'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelize_executor.rb:19:in 'start'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization.rb:49:in 'start'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization.rb:49:in 'map'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization.rb:49:in 'each'
<internal:numeric>:257:in 'times'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization.rb:50:in 'block in start'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:15:in 'start'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:15:in 'fork'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:27:in 'block in start'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:38:in 'work_from_queue'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:49:in 'perform_job'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:474:in 'with_info_handler'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:487:in 'on_signal'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:50:in 'block in perform_job'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:1223:in 'run_one_method'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/executor/test_helper.rb:5:in 'run'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/execution_wrapper.rb:104:in 'perform'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/executor/test_helper.rb:5:in 'block in run'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:89:in 'run'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:382:in 'time_it'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:90:in 'block in run'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:191:in 'capture_exceptions'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:95:in 'block (2 levels) in run'
/Users/curi/w/c/redacted/test/models/image_processor_test.rb:285:in 'block in <class:ImageProcessorTest>'
/Users/curi/w/c/redacted/app/models/image_processor_base.rb:30:in 'smartload'
/Users/curi/w/c/redacted/app/models/image_processor_base.rb:30:in 'new'
/Users/curi/w/c/redacted/app/models/image_processor_base.rb:17:in 'initialize'
/Users/curi/w/c/redacted/app/models/image_processor_vips.rb:13:in 'setup_from_path'
/Users/curi/.gem/ruby/3.4.7/gems/ruby-vips-2.3.0/lib/vips/image.rb:284:in 'new_from_file'
/Users/curi/.gem/ruby/3.4.7/gems/ruby-vips-2.3.0/lib/vips/image.rb:284:in 'vips_foreign_find_load'

-- Threading information ---------------------------------------------------
Total ractor count: 1
Ruby thread count for this ractor: 3

-- Machine register context ------------------------------------------------
  x0: 0xf794951c077abd7b  x1: 0x0000000000000029  x2: 0x0000000000000000
  x3: 0x000000016d76e1fd  x4: 0x0000000000000073  x5: 0x0000000000000073
  x6: 0x0000000000000000  x7: 0xfffff0003ffff800 x18: 0x0000000000000000
 x19: 0x000000016d76e1d0 x20: 0x000000010334e330 x21: 0x00000001989c0d06
 x22: 0x000000016d76e1d0 x23: 0x0000000000000015 x24: 0x000000016d76e1d4
 x25: 0x0000000fffffc104 x26: 0x0000000000000015 x27: 0x0000000000000014
 x28: 0x0000000000000001  lr: 0x000000019064909c  fp: 0x000000016d76e1c0
  sp: 0x000000016d76e1b0

-- C level backtrace information -------------------------------------------
/Users/curi/.rubies/ruby-3.4.7/bin/ruby(rb_vm_bugreport+0xb6c) [0x10290461c]
/Users/curi/.rubies/ruby-3.4.7/bin/ruby(rb_bug_for_fatal_signal+0x100) [0x10273d3bc]
/Users/curi/.rubies/ruby-3.4.7/bin/ruby(sigsegv+0x84) [0x102864c54]
/usr/lib/system/libsystem_platform.dylib(_sigtramp+0x38) [0x190927744]
/usr/lib/system/libsystem_trace.dylib(_os_log_find+0x28) [0x19064909c]
[0x190648dd4]
[0x19889a834]
[0x19077aac4]
[0x190763a60]
[0x1989b6830]
[0x1987e8344]
[0x1276b44d4]
[0x1276c4f54]
[0x1276b0a54]
[0x1276b0960]
[0x1273db210]
[0x12435c078]
[0x12444dcb0]
[0x12435bd70]
[0x12435bf9c]

-- Other runtime information -----------------------------------------------

* Loaded script: bin/rails

* Loaded features:

    0 enumerator.so
    1 thread.rb
    2 fiber.so
    3 rational.so
    4 complex.so
    5 ruby2_keywords.rb
    6 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/3.4.0/arm64-darwin25/enc/encdb.bundle
    7 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/3.4.0/arm64-darwin25/enc/trans/transdb.bundle
    8 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/3.4.0/arm64-darwin25/rbconfig.rb
    9 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/defaults.rb
   10 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/deprecate.rb
   11 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/errors.rb
   12 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/target_rbconfig.rb
   13 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/win_platform.rb
   14 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/unknown_command_spell_checker.rb
   15 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/exceptions.rb
   16 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/basic_specification.rb
   17 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/stub_specification.rb
   18 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/platform.rb
   19 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/specification_record.rb
   20 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/util/list.rb

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions