Skip to content

boost::asio::signal_set crash for boost 1.89.0 #253

Description

@nigels-com

Came across this, possibly "doing it wrong" but possibly a Cobalt bug?

#include <csignal>

#include <boost/cobalt.hpp>
#include <boost/asio.hpp>

boost::cobalt::task<void> signalWait()
{
    auto exec = co_await boost::cobalt::this_coro::executor;
    boost::asio::signal_set signals(exec, SIGINT);
    co_await signals.async_wait(boost::cobalt::use_op);
}

boost::cobalt::main co_main(int argc, char *argv[])
{
    co_await boost::cobalt::join(signalWait());
}

Expected behaviour Typing ^C (SIGINT) will be consumed by the signalWait coroutine and the program will exit normally.

Observed behaviour ^C (SIGINT) results in segfault

According to gdb:

(gdb) signal 2
Continuing with signal SIGINT.

Program received signal SIGSEGV, Segmentation fault.
0x0000555555568743 in boost::asio::cancellation_signal::emit (this=0x7fffffffbc00, type=boost::asio::cancellation_type::total)
    at /opt/boost-1.89.0/include/boost/asio/cancellation_signal.hpp:99
99	      handler_->call(type);
(gdb) where
#0  0x0000555555568743 in boost::asio::cancellation_signal::emit (this=0x7fffffffbc00, type=boost::asio::cancellation_type::total)
    at /opt/boost-1.89.0/include/boost/asio/cancellation_signal.hpp:99
#1  0x0000555555580990 in work::operator() (this=0x7fffffffb7b0, ec=..., sig=2) at /home/nigel-stewart/dev/cobalt/src/main.cpp:45
#2  0x0000555555581f90 in boost::asio::detail::binder2<boost::cobalt::detail::main_promise::run_main(boost::cobalt::main)::work, boost::system::error_code, int>::operator()(void) (
    this=0x7fffffffb7b0) at /opt/boost-1.89.0/include/boost/asio/detail/bind_handler.hpp:181
#3  0x0000555555581edb in boost::asio::detail::handler_work<boost::cobalt::detail::main_promise::run_main(boost::cobalt::main)::work, boost::asio::any_io_executor, void>::complete<boost::asio::detail::binder2<boost::cobalt::detail::main_promise::run_main(boost::cobalt::main)::work, boost::system::error_code, int> >(boost::asio::detail::binder2<boost::cobalt::detail::main_promise::run_main(boost::cobalt::main)::work, boost::system::error_code, int> &, work &) (this=0x7fffffffb7e0, function=..., handler=...)
    at /opt/boost-1.89.0/include/boost/asio/detail/handler_work.hpp:470
#4  0x0000555555581ae1 in boost::asio::detail::signal_handler<boost::cobalt::detail::main_promise::run_main(boost::cobalt::main)::work, boost::asio::any_io_executor>::do_complete(void *, boost::asio::detail::operation *, const boost::system::error_code &, std::size_t) (owner=0x5555555c1610, base=0x5555555c1ca0)
    at /opt/boost-1.89.0/include/boost/asio/detail/signal_handler.hpp:76
#5  0x0000555555563d46 in boost::asio::detail::scheduler_operation::complete (this=0x5555555c1ca0, owner=0x5555555c1610, ec=..., bytes_transferred=0)
    at /opt/boost-1.89.0/include/boost/asio/detail/scheduler_operation.hpp:40
#6  0x0000555555567c4b in boost::asio::detail::scheduler::do_run_one (this=0x5555555c1610, lock=..., this_thread=..., ec=...)
    at /opt/boost-1.89.0/include/boost/asio/detail/impl/scheduler.ipp:501
#7  0x00005555555675fa in boost::asio::detail::scheduler::run (this=0x5555555c1610, ec=...) at /opt/boost-1.89.0/include/boost/asio/detail/impl/scheduler.ipp:217
#8  0x00005555555839bf in boost::asio::io_context::run (this=0x7fffffffbaa0) at /opt/boost-1.89.0/include/boost/asio/impl/io_context.ipp:63
#9  0x0000555555580c1a in boost::cobalt::detail::main_promise::run_main (mn=...) at /home/nigel-stewart/dev/cobalt/src/main.cpp:61
#10 0x0000555555569921 in boost::cobalt::detail::main (argc=1, argv=0x7fffffffdcd8) at /home/nigel-stewart/dev/cobalt/include/boost/cobalt/detail/main.hpp:123

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions