Opened 4 years ago
Last modified 4 years ago
#13562 new Bugs
Missing null pointer check in compensating_work_started
| Reported by: | Owned by: | chris_kohlhoff | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | asio |
| Version: | Boost 1.66.0 | Severity: | Problem |
| Keywords: | Cc: |
Description
In boost/asio/detail/impl/scheduler.ipp(275):
void scheduler::compensating_work_started()
{
thread_info_base* this_thread = thread_call_stack::contains(this);
++static_cast<thread_info*>(this_thread)->private_outstanding_work;
}
there is a missing null pointer check for this_thread, other routines have one!
I saw the error comming from boost/asio/detail/impl/epoll_reactor.ipp(712):
688 struct epoll_reactor::perform_io_cleanup_on_block_exit
689 {
690 explicit perform_io_cleanup_on_block_exit(epoll_reactor* r)
691 : reactor_(r), first_op_(0)
692 {
693 }
694
695 ~perform_io_cleanup_on_block_exit()
696 {
697 if (first_op_)
698 {
699 // Post the remaining completed operations for invocation.
700 if (!ops_.empty())
701 reactor_->scheduler_.post_deferred_completions(ops_);
702
703 // A user-initiated operation has completed, but there's no need to
704 // explicitly call work_finished() here. Instead, we'll take advantage of
705 // the fact that the scheduler will call work_finished() once we return.
706 }
707 else
708 {
709 // No user-initiated operations have completed, so we need to compensate
710 // for the work_finished() call that the scheduler will make once this
711 // operation returns.
712 reactor_->scheduler_.compensating_work_started();
713 }
714 }
Note:
See TracTickets
for help on using tickets.

Just found this ticket while googling for a crash I'm currently trying to fix:
The relevant TLS entry is null:
(gdb) print boost::asio::detail::call_stack<boost::asio::detail::thread_context, boost::asio::detail::thread_info_base>::top_.tss_key_ $1 = 8 (gdb) print *((struct pthread*)pthread_self())->specific@32 $2 = {0x618ff42c, 0x0 <repeats 31 times>}Reproduces when an executable linked against multiple shared libraries that are linked against static boost.