!VRULIdgoKmKPzJZzjj:nixos.org

Nix Hackers

940 Members
For people hacking on the Nix package manager itself196 Servers

Load older messages


SenderMessageTime
1 Apr 2026
@dramforever:matrix.orgdramforeverstill looks like fetcher problems?15:52:17
@dramforever:matrix.orgdramforeverlooks like the fetcher is not locking the tmp path?15:52:29
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Hm the boost regex thing is actually baffling https://www.boost.org/doc/libs/latest/libs/regex/doc/html/boost_regex/background/thread_safety.html15:52:37
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)The docs say it is thread safee...15:52:49
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)

But:


#0  std::_List_iterator<std::pair<std::shared_ptr<boost::re_detail_500::cpp_regex_traits_implementation<char> const>, boost::re_detail_500::cpp_regex_traits_base<char> const*> >::operator++ (this=<optimized out>)
    at /nix/store/yps9cjmi8g58mh0f7pw902br7gxwg2dz-gcc-14.3.0/include/c++/14.3.0/bits/stl_list.h:290
#1  std::__cxx11::list<std::pair<std::shared_ptr<boost::re_detail_500::cpp_regex_traits_implementation<char> const>, boost::re_detail_500::cpp_regex_traits_base<char> const*>, std::allocator<std::pair<std::shared_ptr<boost::re_detail_500::cpp_regex_traits_implementation<char> const>, boost::re_detail_500::cpp_regex_traits_base<char> const*> > >::splice (this=0x7ff093ffcc00, __position={...},
    __i=<error reading variable: Cannot access memory at address 0x50>, __x=...)
    at /nix/store/yps9cjmi8g58mh0f7pw902br7gxwg2dz-gcc-14.3.0/include/c++/14.3.0/bits/stl_list.h:1672
#2  std::__cxx11::list<std::pair<std::shared_ptr<boost::re_detail_500::cpp_regex_traits_implementation<char> const>, boost::re_detail_500::cpp_regex_traits_base<char> const*>, std::allocator<std::pair<std::shared_ptr<boost::re_detail_500::cpp_regex_traits_implementation<char> const>, boost::re_detail_500::cpp_regex_traits_base<char> const*> > >::splice (this=0x7ff093ffcc00, __position={...},
    __i=<error reading variable: Cannot access memory at address 0x50>, __x=...)
    at /nix/store/yps9cjmi8g58mh0f7pw902br7gxwg2dz-gcc-14.3.0/include/c++/14.3.0/bits/stl_list.h:1699
#3  boost::object_cache<boost::re_detail_500::cpp_regex_traits_base<char>, boost::re_detail_500::cpp_regex_traits_implementation<char> >::do_get (k=..., l_max_cache_size=l_max_cache_size@entry=5)
    at /nix/store/zw6w6chqvqsh2c6jfsb4pw9bpgdkmjnh-boost-1.87.0-dev/include/boost/regex/v5/object_cache.hpp:100
#4  0x00007ff4bd772e95 in boost::object_cache<boost::re_detail_500::cpp_regex_traits_base<char>, boost::re_detail_500::cpp_regex_traits_implementation<char> >::get (k=..., l_max_cache_size=5)
    at /nix/store/zw6w6chqvqsh2c6jfsb4pw9bpgdkmjnh-boost-1.87.0-dev/include/boost/regex/v5/object_cache.hpp:70
#5  boost::re_detail_500::create_cpp_regex_traits<char> (l=Python Exception <class 'gdb.error'>: There is no member named _M_impl.
)
    at /nix/store/zw6w6chqvqsh2c6jfsb4pw9bpgdkmjnh-boost-1.87.0-dev/include/boost/regex/v5/cpp_regex_traits.hpp:729
#6  0x00007ff4bd772d7f in boost::cpp_regex_traits<char>::cpp_regex_traits (this=0x7ff08c009ef0)
    at /nix/store/zw6w6chqvqsh2c6jfsb4pw9bpgdkmjnh-boost-1.87.0-dev/include/boost/regex/v5/cpp_regex_traits.hpp:749
#7  boost::regex_traits<char, boost::cpp_regex_traits<char> >::regex_traits (this=0x7ff08c009ef0)
    at /nix/store/zw6w6chqvqsh2c6jfsb4pw9bpgdkmjnh-boost-1.87.0-dev/include/boost/regex/v5/regex_traits.hpp:39
#8  boost::regex_traits_wrapper<boost::regex_traits<char, boost::cpp_regex_traits<char> > >::regex_traits_wrapper (this=0x7ff08c009ef0)
    at /nix/store/zw6w6chqvqsh2c6jfsb4pw9bpgdkmjnh-boost-1.87.0-dev/include/boost/regex/v5/regex_traits.hpp:121
#9  boost::re_detail_500::regex_data<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::regex_data (this=0x7ff08c009d50)
    at /nix/store/zw6w6chqvqsh2c6jfsb4pw9bpgdkmjnh-boost-1.87.0-dev/include/boost/regex/v5/basic_regex.hpp:172
#10 0x00007ff4bd7729bd in boost::re_detail_500::basic_regex_implementation<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::basic_regex_implementation (this=0x7ff08c009d50)
    at /nix/store/zw6w6chqvqsh2c6jfsb4pw9bpgdkmjnh-boost-1.87.0-dev/include/boost/regex/v5/basic_regex.hpp:212
#11 boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::do_assign (
    this=this@entry=0x7ff4bd90cad0 <nix::quoteRegexChars(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::specialRegex>, p1=p1@entry=0x7ff4bd580f79 <.L.str.27> "[.^$\\\\*+?()\\[\\]{}|]", p2=0x7ff4bd580f8c <.L.str.27+19> "", f=f@entry=0)
    at /nix/store/zw6w6chqvqsh2c6jfsb4pw9bpgdkmjnh-boost-1.87.0-dev/include/boost/regex/v5/basic_regex.hpp:640
#12 0x00007ff4bd76d593 in boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::assign (
    this=0x7ff4bd90cad0 <nix::quoteRegexChars(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::specialRegex>, p1=0x7ff4bd580f79 <.L.str.27> "[.^$\\\\*+?()\\[\\]{}|]", p2=0x7ff093ffcc00 "", p2@entry=0x0, f=0)
    at /nix/store/zw6w6chqvqsh2c6jfsb4pw9bpgdkmjnh-boost-1.87.0-dev/include/boost/regex/v5/basic_regex.hpp:387
#13 boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::assign (
    this=0x7ff4bd90cad0 <nix::quoteRegexChars(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)::specialRegex>, p=0x7ff4bd580f79 <.L.str.27> "[.^$\\\\*+?()\\[\\]{}|]", f=0)
15:53:18
@dramforever:matrix.orgdramforeverwhich ones have you reproduced yet15:53:28
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Consistently hitting the boost sigsev, nothing else yet15:53:53
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Ohhhh15:54:27
@dramforever:matrix.orgdramforever

yeah i just...

diff --git a/src/libstore/local-gc.cc b/src/libstore/local-gc.cc
index e3c74f357..32a20c0ea 100644
--- a/src/libstore/local-gc.cc
+++ b/src/libstore/local-gc.cc
@@ -66,3 +66,3 @@ Roots findRuntimeRootsUnchecked(const StoreDirConfig & config)
     auto procDir = AutoCloseDir{opendir("/proc")};
-    if (procDir) {
+    if (procDir && false) {
         struct dirent * ent;
15:55:24
@dramforever:matrix.orgdramforeveri hope this is not too bad, as mentioned i don't think builder temproots should rely on /proc15:55:35
@dramforever:matrix.orgdramforeverbut maybe that's actually what's exposing all of the problems15:55:57
@dramforever:matrix.orgdramforevernow that i think about it15:56:23
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Ah yes. Very true15:56:34
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Hm do you build nix from nixpkgs?15:57:28
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)It’s our packaging that’s busted and builds boost without threading support.15:58:17
@dramforever:matrix.orgdramforever no that's nix develop on the commit's flake.lock 15:58:21
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)And somehow that makes everything not thread safe15:58:27
@dramforever:matrix.orgdramforeveroh15:59:14
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Yeah adding —with-thread in dependencies.nix should fix it. This is sooo stupid15:59:38
@dramforever:matrix.orgdramforever

but this doesn't trip?

#ifndef BOOST_HAS_THREADS
#error "what"
#endif
15:59:50
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Yeah that disables a mutex in boost used for their global regex cache16:00:18
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Lemme test this16:01:07
@xokdvium:matrix.orgSergei Zimmerman (xokdvium) Eh seems like maybe I’m wrong 16:06:10
@xokdvium:matrix.orgSergei Zimmerman (xokdvium) And it’s just legitimately broken. Segfaults even with BOOST_HAS_THREADS. Wth 16:07:39
@dramforever:matrix.orgdramforeveri'm having the same feeling as when i was watching https://www.youtube.com/watch?v=YsXCVsDFiXA16:10:28
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Lemme try with thread sanitizer16:10:33
@dramforever:matrix.orgdramforeverbefore: "why does nix crash so much?" after: "why doesn't nix crash all the time?"16:10:52
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)

Ok my hypothesis was wrong. Boost's BOOST_HAS_THREADS is never false for us. It seems like a cross-thread ownership issue:

SUMMARY: ThreadSanitizer: heap-use-after-free (/nix/store/cgz3m1ahqxkw9f59b5vfxrdck0nksapi-nix-store-2.35.0pre/lib/libnixstore.so.2.35.0+0x2892d4) in nix::findRuntimeRootsUnchecked[abi:cxx11](nix::StoreDirConfig const&)
==================
==================
WARNING: ThreadSanitizer: heap-use-after-free (pid=765420)
  Read of size 4 at 0x724c00020230 by thread T18:
    #0 nix::findRuntimeRootsUnchecked[abi:cxx11](nix::StoreDirConfig const&) <null> (libnixstore.so.2.35.0+0x289504)
    #1 nix::LocalStore::findRuntimeRoots(boost::unordered::unordered_flat_map<nix::StorePath, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::hash<nix::StorePath>, std::equal_to<nix::StorePath>, std::allocator<std::pair<nix::StorePath const, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&, bool) <null> (libnixstore.so.2.35.0+0x238a15)
    #2 nix::LocalStore::findRootsNoTemp(boost::unordered::unordered_flat_map<nix::StorePath, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::hash<nix::StorePath>, std::equal_to<nix::StorePath>, std::allocator<std::pair<nix::StorePath const, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&, bool) <null> (libnixstore.so.2.35.0+0x23bc45)
    #3 nix::LocalStore::collectGarbage(nix::GCOptions const&, nix::GCResults&) <null> (libnixstore.so.2.35.0+0x24339b)
    #4 nix::LocalStore::autoGC(bool)::{lambda()#2}::operator()() [clone .lto_priv.0] <null> (libnixstore.so.2.35.0+0x242752)
    #5 std::thread::_State_impl<std::thread::_Invoker<std::tuple<nix::LocalStore::autoGC(bool)::{lambda()#2}> > >::_M_run() [clone .lto_priv.0] <null> (libnixstore.so.2.35.0+0x4955ad)
    #6 execute_native_thread_routine <null> (libstdc++.so.6+0xed063)

  Previous write of size 8 at 0x724c00020230 by thread T18:
    #0 operator delete(void*, unsigned long) <null> (libtsan.so.2+0xa4a2b)
    #1 nix::readProcLink(std::filesystem::__cxx11::path const&, boost::unordered::unordered_flat_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&) [clone .lto_priv.0] <null> (libnixstore.so.2.35.0+0x282dd7)
    #2 nix::findRuntimeRootsUnchecked[abi:cxx11](nix::StoreDirConfig const&) <null> (libnixstore.so.2.35.0+0x28b066)
    #3 nix::LocalStore::findRuntimeRoots(boost::unordered::unordered_flat_map<nix::StorePath, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::hash<nix::StorePath>, std::equal_to<nix::StorePath>, std::allocator<std::pair<nix::StorePath const, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&, bool) <null> (libnixstore.so.2.35.0+0x238a15)
    #4 nix::LocalStore::findRootsNoTemp(boost::unordered::unordered_flat_map<nix::StorePath, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::hash<nix::StorePath>, std::equal_to<nix::StorePath>, std::allocator<std::pair<nix::StorePath const, boost::unordered::unordered_flat_set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nix::StringViewHash, std::equal_to<void>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&, bool) <null> (libnixstore.so.2.35.0+0x23bc45)
    #5 nix::LocalStore::collectGarbage(nix::GCOptions const&, nix::GCResults&) <null> (libnixstore.so.2.35.0+0x24339b)
    #6 nix::LocalStore::autoGC(bool)::{lambda()#2}::operator()() [clone .lto_priv.0] <null> (libnixstore.so.2.35.0+0x242752)
    #7 std::thread::_State_impl<std::thread::_Invoker<std::tuple<nix::LocalStore::autoGC(bool)::{lambda()#2}> > >::_M_run() [clone .lto_priv.0] <null> (libnixstore.so.2.35.0+0x4955ad)
    #8 execute_native_thread_routine <null> (libstdc++.so.6+0xed063)
16:42:59
@sebastian:srx.digitalsebastian changed their display name from crstl to sebastian.21:09:09
@sebastian:srx.digitalsebastian changed their profile picture.21:09:33

Show newer messages


Back to Room ListRoom Version: 6