boostorg / process

Boost Process
https://www.boost.org/libs/process
115 stars 113 forks source link

POSIX wait_for - stack overflow #232

Open fsmoke opened 2 years ago

fsmoke commented 2 years ago

I've got stack overflow in my video project. Please see log below:

Piece of log ``` #261918 0x000000000050af69 in boost::process::detail::posix::wait_until > >(boost::process::detail::posix::child_handle const&, int&, std::chrono::time_point > > const&, std::error_code&)::signal_interceptor_t::handler_func(int) (val=58487) at /usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:69 #261919 0x000000000050af69 in boost::process::detail::posix::wait_until > >(boost::process::detail::posix::child_handle const&, int&, std::chrono::time_point > > const&, std::error_code&)::signal_interceptor_t::handler_func(int) (val=58487) at /usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:69 #261920 0x000000000050af69 in boost::process::detail::posix::wait_until > >(boost::process::detail::posix::child_handle const&, int&, std::chrono::time_point > > const&, std::error_code&)::signal_interceptor_t::handler_func(int) (val=58487) at /usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:69 #261921 0x000000000050af69 in boost::process::detail::posix::wait_until > >(boost::process::detail::posix::child_handle const&, int&, std::chrono::time_point > > const&, std::error_code&)::signal_interceptor_t::handler_func(int) (val=58487) at /usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:69 #261922 0x000000000050af69 in boost::process::detail::posix::wait_until > >(boost::process::detail::posix::child_handle const&, int&, std::chrono::time_point > > const&, std::error_code&)::signal_interceptor_t::handler_func(int) (val=58487) at /usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:69 #261923 0x000000000050af69 in boost::process::detail::posix::wait_until > >(boost::process::detail::posix::child_handle const&, int&, std::chrono::time_point > > const&, std::error_code&)::signal_interceptor_t::handler_func(int) (val=58487) at /usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:69 #261924 0x000000000050af69 in boost::process::detail::posix::wait_until > >(boost::process::detail::posix::child_handle const&, int&, std::chrono::time_point > > const&, std::error_code&)::signal_interceptor_t::handler_func(int) (val=58487) at /usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:69 #261925 0x000000000050af69 in boost::process::detail::posix::wait_until > >(boost::process::detail::posix::child_handle const&, int&, std::chrono::time_point > > const&, std::error_code&)::signal_interceptor_t::handler_func(int) (val=58487) at /usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:69 #261926 0x000000000050b21d in boost::process::detail::posix::wait_until > > (p=..., exit_code=@0x7aa4f44ef680: 0, time_out=..., ec=...) at /usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:117 #261927 0x0000000000503ce8 in boost::process::child::wait_until > > (this=0x7aa68400aaa0, timeout_time=..., ec=...) at /usr/local/include/boost/process/detail/child_decl.hpp:193 #261928 0x000000000051302d in boost::process::child::wait_for > (this=0x7aa68400aaa0, rel_time=..., ec=...) at /usr/local/include/boost/process/detail/child_decl.hpp:184 #261929 0x000000000050ad31 in boost::process::child::wait_for > (this=0x7aa68400aaa0, rel_time=...) at /usr/local/include/boost/process/detail/child_decl.hpp:132 #261930 0x0000000000514da7 in process_launcher::start_process, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}::operator()() (this=0x7aa68400aa70) at /home/user/projects/arcturus/trunk/src/projects/components/modules/video_subsystem/build/vs2019/../../include/process_launcher.hpp:255 #261931 0x00000000005552c9 in std::__invoke_impl, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}>(std::__invoke_other, process_launcher::start_process, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}&&) (__f=...) at /usr/local/gcc-10/include/c++/10.3.0/bits/invoke.h:60 #261932 0x0000000000554f6e in std::__invoke, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&) (__fn=...) at /usr/local/gcc-10/include/c++/10.3.0/bits/invoke.h:95 #261933 0x0000000000554994 in std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) (this=0x7aa68400af78) at /usr/local/gcc-10/include/c++/10.3.0/thread:264 #261934 0x0000000000554254 in std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >::operator()() (this=0x7aa68400af78) at /usr/local/gcc-10/include/c++/10.3.0/thread:271 #261935 0x0000000000553a2f in std::__future_base::_Task_setter, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void>::operator()() const (this=0x7aa4f44efdd0) at /usr/local/gcc-10/include/c++/10.3.0/future:1373 #261936 0x00000000005531ee in std::__invoke_impl, std::__future_base::_Result_base::_Deleter>, std::__future_base::_Task_setter, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void>&>(std::__invoke_other, std::__future_base::_Task_setter, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void>&) (__f=...) at /usr/local/gcc-10/include/c++/10.3.0/bits/invoke.h:60 #261937 0x0000000000552577 in std::__invoke_r, std::__future_base::_Task_setter, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void>&>(std::__future_base::_Task_setter, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void>&) (__fn=...) at /usr/local/gcc-10/include/c++/10.3.0/bits/invoke.h:115 #261938 0x00000000005515c8 in std::_Function_handler (), std::__future_base::_Task_setter, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void> >::_M_invoke(std::_Any_data const&) (__functor=...) at /usr/local/gcc-10/include/c++/10.3.0/bits/std_function.h:292 #261939 0x00000000004fa143 in std::function ()>::operator()() const (this=0x7aa4f44efdd0) at /usr/local/gcc-10/include/c++/10.3.0/bits/std_function.h:622 #261940 0x00000000004f262d in std::__future_base::_State_baseV2::_M_do_set(std::function ()>*, bool*) (this=0x7aa68400af40, __f=0x7aa4f44efdd0, __did_set=0x7aa4f44efd47) at /usr/local/gcc-10/include/c++/10.3.0/future:572 #261941 0x0000000000508da1 in std::__invoke_impl ()>*, bool*), std::__future_base::_State_baseV2*, std::function ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function ()>*&&, bool*&&) (__f=@0x7aa4f44efd60: (void (std::__future_base::_State_baseV2::*)(std::__future_base::_State_baseV2 * const, std::function()> *, bool *)) 0x4f2606 ()>*, bool*)>, __t=@0x7aa4f44efd58: 0x7aa68400af40) at /usr/local/gcc-10/include/c++/10.3.0/bits/invoke.h:73 #261942 0x00000000005017c1 in std::__invoke ()>*, bool*), std::__future_base::_State_baseV2*, std::function ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function ()>*&&, bool*&&) (__fn=@0x7aa4f44efd60: (void (std::__future_base::_State_baseV2::*)(std::__future_base::_State_baseV2 * const, std::function()> *, bool *)) 0x4f2606 ()>*, bool*)>) at /usr/local/gcc-10/include/c++/10.3.0/bits/invoke.h:95 #261943 0x00000000004f9f0e in std::call_once ()>*, bool*), std::__future_base::_State_baseV2*, std::function ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function ()>*&&, bool*&&)::{lambda()#1}::operator()() const (this=0x7aa4f44efce0) at /usr/local/gcc-10/include/c++/10.3.0/mutex:717 #261944 0x00000000004f9f39 in std::call_once ()>*, bool*), std::__future_base::_State_baseV2*, std::function ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function ()>*&&, bool*&&)::{lambda()#2}::operator()() const (this=0x0) at /usr/local/gcc-10/include/c++/10.3.0/mutex:722 #261945 0x00000000004f9f4a in std::call_once ()>*, bool*), std::__future_base::_State_baseV2*, std::function ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function ()>*&&, bool*&&)::{lambda()#2}::_FUN() () at /usr/local/gcc-10/include/c++/10.3.0/mutex:722 #261946 0x00007aa6aa58b759 in __pthread_once_slow () from /lib/x86_64-linux-gnu/libpthread.so.0 #261947 0x00000000004e0bba in __gthread_once (__once=0x7aa68400af58, __func=0x4115a0 <__once_proxy@plt>) at /usr/local/gcc-10/include/c++/10.3.0/x86_64-linux-gnu/bits/gthr-default.h:700 #261948 0x00000000004f9fd6 in std::call_once ()>*, bool*), std::__future_base::_State_baseV2*, std::function ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function ()>*&&, bool*&&) (__once=..., __f=@0x7aa4f44efd60: (void (std::__future_base::_State_baseV2::*)(std::__future_base::_State_baseV2 * const, std::function()> *, bool *)) 0x4f2606 ()>*, bool*)>) at /usr/local/gcc-10/include/c++/10.3.0/mutex:729 #261949 0x00000000004f2457 in std::__future_base::_State_baseV2::_M_set_result(std::function ()>, bool) (this=0x7aa68400af40, __res=..., __ignore_failure=false) at /usr/local/gcc-10/include/c++/10.3.0/future:412 #261950 0x000000000054e7f7 in std::__future_base::_Async_state_impl, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void>::_Async_state_impl(std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >&&)::{lambda()#1}::operator()() const (this=0x7aa68400af40) at /usr/local/gcc-10/include/c++/10.3.0/future:1682 #261951 0x0000000000556faf in std::__invoke_impl, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void>::_Async_state_impl(std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >&&)::{lambda()#1}>(std::__invoke_other, std::__future_base::_Async_state_impl, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void>::_Async_state_impl(std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >&&)::{lambda()#1}&&) (__f=...) at /usr/local/gcc-10/include/c++/10.3.0/bits/invoke.h:60 #261952 0x0000000000556f20 in std::__invoke, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void>::_Async_state_impl(std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >&&)::{lambda()#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&) (__fn=...) at /usr/local/gcc-10/include/c++/10.3.0/bits/invoke.h:95 #261953 0x0000000000556df0 in std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void>::_Async_state_impl(std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >&&)::{lambda()#1}> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) (this=0x7aa684004878) at /usr/local/gcc-10/include/c++/10.3.0/thread:264 #261954 0x0000000000556b80 in std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void>::_Async_state_impl(std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >&&)::{lambda()#1}> >::operator()() (this=0x7aa684004878) at /usr/local/gcc-10/include/c++/10.3.0/thread:271 #261955 0x0000000000555ac8 in std::thread::_State_impl, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >, void>::_Async_state_impl(std::thread::_Invoker, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)> >(arcturus::core_object_m, std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda(auto:1 const&)#1}>(std::_Bind, boost::uuids::uuid))(std::span const&, boost::uuids::uuid const&)>&&)::{lambda()#1}> >&&)::{lambda()#1}> > >::_M_run() (this=0x7aa684004870) at /usr/local/gcc-10/include/c++/10.3.0/thread:215 #261956 0x00007aa6a9c1c830 in ?? () from /usr/local/gcc-10/lib64/libstdc++.so.6 #261957 0x00007aa6aa5844a4 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0 #261958 0x00007aa6a937cd0f in clone () from /lib/x86_64-linux-gnu/libc.so.6 (gdb) ```

Error in line /usr/local/include/boost/process/detail/posix/wait_for_exit.hpp:69

 static void handler_func(int val)
        {
            if ((sigchld_handler != SIG_DFL) && (sigchld_handler != SIG_IGN))
                sigchld_handler(val); //THIS ONE
        }

It seems somehow sigchld_handler became set to handler_func - i.e. it calls itself

PS Boost 1.76

fsmoke commented 2 years ago

in this issue https://github.com/boostorg/process/issues/168 @griwes, writed comment about this issue - but i can not find this issue - so i decided to create new one

daravi commented 2 years ago

Thank you @fsmoke for filing this I was going crazy trying to figure out what is happening. At least now I know this is a known issue.

SilverPlate3 commented 1 year ago

@fsmoke & @daravi Can you please post the code that caused the overflow?

For example:

int main()
{
     boost::process::child("doesnt-exist");
     child.wait()
}