NixOS / nix

Nix, the purely functional package manager
https://nixos.org/
GNU Lesser General Public License v2.1
12.59k stars 1.51k forks source link

Segfault in libgc.so in Nix 2.13 #7644

Closed danielfullmer closed 1 year ago

danielfullmer commented 1 year ago

Describe the bug

When building a certain very large Nix closure. I encounter a segfault in boehm-gc.

I only have this problem in Nix 2.13, but not in Nix 2.12. I have further bisected the segfault to this commit in Nix which upgrades to use nixpkgs 22.11: 9c90452f9d211ebac3657745283fae0f00e2bd71

Backtrace:

#0  0x00007ffff7b6a510 in GC_push_all_eager () from /nix/store/x42zqs79lkyi88k1nj4x0bp15jpvwq2v-boehm-gc-8.2.2/lib/libgc.so.1
#1  0x00007ffff7b70b17 in GC_default_push_other_roots () from /nix/store/x42zqs79lkyi88k1nj4x0bp15jpvwq2v-boehm-gc-8.2.2/lib/libgc.so.1
#2  0x00007ffff7b69af4 in GC_mark_some () from /nix/store/x42zqs79lkyi88k1nj4x0bp15jpvwq2v-boehm-gc-8.2.2/lib/libgc.so.1
#3  0x00007ffff7b6d5bd in GC_stopped_mark () from /nix/store/x42zqs79lkyi88k1nj4x0bp15jpvwq2v-boehm-gc-8.2.2/lib/libgc.so.1
#4  0x00007ffff7b6e214 in GC_try_to_collect_inner () from /nix/store/x42zqs79lkyi88k1nj4x0bp15jpvwq2v-boehm-gc-8.2.2/lib/libgc.so.1
#5  0x00007ffff7b6e44e in GC_collect_or_expand () from /nix/store/x42zqs79lkyi88k1nj4x0bp15jpvwq2v-boehm-gc-8.2.2/lib/libgc.so.1
#6  0x00007ffff7b70079 in GC_generic_malloc_inner () from /nix/store/x42zqs79lkyi88k1nj4x0bp15jpvwq2v-boehm-gc-8.2.2/lib/libgc.so.1
#7  0x00007ffff7b74137 in GC_generic_malloc_many () from /nix/store/x42zqs79lkyi88k1nj4x0bp15jpvwq2v-boehm-gc-8.2.2/lib/libgc.so.1
#8  0x00007ffff7b74312 in GC_malloc_kind () from /nix/store/x42zqs79lkyi88k1nj4x0bp15jpvwq2v-boehm-gc-8.2.2/lib/libgc.so.1
#9  0x00007ffff7d6e0cf in nix::Value::mkString(std::basic_string_view<char, std::char_traits<char> >) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#10 0x00007ffff7e300f5 in nix::prim_attrNames(nix::EvalState&, nix::PosIdx, nix::Value**, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#11 0x00007ffff7d7affa in nix::EvalState::callFunction(nix::Value&, unsigned long, nix::Value**, nix::Value&, nix::PosIdx) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#12 0x00007ffff7d7c0cb in nix::ExprCall::eval(nix::EvalState&, nix::Env&, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#13 0x00007ffff7e2f16b in nix::prim_foldlStrict(nix::EvalState&, nix::PosIdx, nix::Value**, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#14 0x00007ffff7d7affa in nix::EvalState::callFunction(nix::Value&, unsigned long, nix::Value**, nix::Value&, nix::PosIdx) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#15 0x00007ffff7d7c0cb in nix::ExprCall::eval(nix::EvalState&, nix::Env&, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#16 0x00007ffff7d7aeec in nix::EvalState::callFunction(nix::Value&, unsigned long, nix::Value**, nix::Value&, nix::PosIdx) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#17 0x00007ffff7d7c0cb in nix::ExprCall::eval(nix::EvalState&, nix::Env&, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#18 0x000000000057802d in void nix::EvalState::forceValue<nix::EvalState::forceValue(nix::Value&, nix::PosIdx)::{lambda()#1}>(nix::Value&, nix::EvalState::forceValue(nix::Value&, nix::PosIdx)::{lambda()#1}) ()
#19 0x00007ffff7e3d3eb in nix::prim_genericClosure(nix::EvalState&, nix::PosIdx, nix::Value**, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#20 0x00007ffff7d7affa in nix::EvalState::callFunction(nix::Value&, unsigned long, nix::Value**, nix::Value&, nix::PosIdx) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#21 0x00007ffff7d7c0cb in nix::ExprCall::eval(nix::EvalState&, nix::Env&, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#22 0x00007ffff7e2f16b in nix::prim_foldlStrict(nix::EvalState&, nix::PosIdx, nix::Value**, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#23 0x00007ffff7d7affa in nix::EvalState::callFunction(nix::Value&, unsigned long, nix::Value**, nix::Value&, nix::PosIdx) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#24 0x00007ffff7d7c0cb in nix::ExprCall::eval(nix::EvalState&, nix::Env&, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#25 0x000000000057802d in void nix::EvalState::forceValue<nix::EvalState::forceValue(nix::Value&, nix::PosIdx)::{lambda()#1}>(nix::Value&, nix::EvalState::forceValue(nix::Value&, nix::PosIdx)::{lambda()#1}) ()
#26 0x00007ffff7d80bf5 in nix::ExprVar::eval(nix::EvalState&, nix::Env&, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#27 0x00007ffff7d7aeec in nix::EvalState::callFunction(nix::Value&, unsigned long, nix::Value**, nix::Value&, nix::PosIdx) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#28 0x00007ffff7d7c0cb in nix::ExprCall::eval(nix::EvalState&, nix::Env&, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#29 0x00007ffff7e3283b in nix::prim_hasAttr(nix::EvalState&, nix::PosIdx, nix::Value**, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#30 0x00007ffff7d7affa in nix::EvalState::callFunction(nix::Value&, unsigned long, nix::Value**, nix::Value&, nix::PosIdx) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#31 0x00007ffff7d7c0cb in nix::ExprCall::eval(nix::EvalState&, nix::Env&, nix::Value&) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#32 0x00007ffff7d7aeec in nix::EvalState::callFunction(nix::Value&, unsigned long, nix::Value**, nix::Value&, nix::PosIdx) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#33 0x00007ffff7e26a9a in std::_Function_handler<bool (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), nix::addPath(nix::EvalState&, nix::PosIdx, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::Value*, nix::FileIngestionMethod, std::optional<nix::Hash>, nix::Value&, std::set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)::{lambda(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)#1}>::_M_invoke(std::_Any_data const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixexpr.so
#34 0x00007ffff74f9057 in nix::dump(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, nix::Sink&, std::function<bool (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>&) () from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixutil.so
#35 0x00007ffff75750b4 in void boost::context::detail::fiber_entry<boost::context::detail::fiber_record<boost::context::fiber, nix::VirtualStackAllocator, boost::coroutines2::detail::pull_coroutine<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::control_block::control_block<nix::VirtualStackAllocator, nix::sinkToSource(std::function<void (nix::Sink&)>, std::function<void ()>)::SinkToSource::read(char*, unsigned long)::{lambda(boost::coroutines2::detail::push_coroutine<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&)#1}>(boost::context::preallocated, nix::VirtualStackAllocator&&, nix::sinkToSource(std::function<void (nix::Sink&)>, std::function<void ()>)::SinkToSource::read(char*, unsigned long)::{lambda(boost::coroutines2::detail::push_coroutine<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&)#1}&&)::{lambda(boost::context::fiber&&)#1}> >(boost::context::detail::transfer_t) ()
   from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libnixutil.so
#36 0x00007ffff6e9b18f in make_fcontext () from /nix/store/2pf95p0wbidrwfl15s1mg88i8y78vg7y-nix-2.12.0pre20221129_9c90452/lib/libboost_context.so.1.79.0
#37 0x0000000000000000 in ?? ()

Steps To Reproduce

I'm currently working to find a more minimal reproducing example that I can share. I'm running on x86_64-linux.

Expected behavior

Nix to not segfault.

nix-env --version output nix-env (Nix) 2.13.1 x86_64-linux

amesgen commented 1 year ago

I think we are seeing this in our CI, downgrading to 2.12 resolves the issue: https://github.com/tweag/ormolu/actions/runs/3970176309/jobs/6805720771

amesgen commented 1 year ago

Reproducible command to trigger the segfault:

nix run github:NixOS/nix/2.13.1 -- \
  path-info --derivation \
  github:tweag/ormolu/23a13e28d13e995a0dbfc29b2a66f21a5722bc3f#ci \
  --substituters 'https://tweag-ormolu.cachix.org https://cache.iog.io' \
  --trusted-public-keys 'hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ= tweag-ormolu.cachix.org-1:3O4XG3o4AGquSwzzmhF6lov58PYG6j9zHcTDiROqkjM='

Using 2.12.0 instead works fine instead (you might have to delete/ignore the eval cache to trigger the bug again after that of course). Bisecting also points to 9c90452f9d211ebac3657745283fae0f00e2bd71 :+1:

danielfullmer commented 1 year ago

I can confirm the fix from @roberth resolves my issue.

roberth commented 1 year ago

The fix has been released in 2.13.2.