Bug #18164
closedSegfault after spawn when using modified ENV
Description
The attached segfault.rb causes a segfault on Ruby 3.0.2 (also on 2.7.2+). This is the smallest reproducer we could get.
ENV = {}
spawn({}, "true")
ENV.replace({})
You can also change the last line to ENV.to_s
and it also segfaults.
Note that while this script is the smallest reproducer we could get to, it's unlikely that someone might replace the ENV in this way directly. A more realistic usage scenario (which is how I found this) is using RSpec, having a spec that spawns a subprocess, using stub_const
to have an alternate ENV, and using Bundler.with_unbundled_env
to ensure that bundler env vars are not passed to the child process. This is demonstrated in the attached segfault_spec.rb. Here, stub_const
effectively does the ENV = {}
portion, and Bundler.with_unbundled_env
does the ENV.replace({})
portion (https://github.com/rubygems/rubygems/blob/b737e1c930aaca15618c702f10553992087e2bc4/bundler/lib/bundler.rb#L693)
Files