Project

General

Profile

Actions

Bug #18164

closed

Segfault after spawn when using modified ENV

Added by Fryguy (Jason Frey) over 2 years ago. Updated over 2 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-darwin20]
[ruby-core:105223]

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

segfault.rb (43 Bytes) segfault.rb Fryguy (Jason Frey), 09/13/2021 04:07 PM
segfault_spec.rb (255 Bytes) segfault_spec.rb Fryguy (Jason Frey), 09/13/2021 04:07 PM
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0