i2pd: segfault when sending SAM raw datagrams

When sending a raw datagram using SAM, i.e. by calling this function, I get a segmentation fault.

Backtrace:

Thread 14 "i2pd" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffdeffd700 (LWP 8880)]
0x0000000000f30308 in i2p::datagram::DatagramDestination::SendDatagramTo(unsigned char const*, unsigned long, i2p::data::Tag<32ul> const&, unsigned short, unsigned short) ()
(gdb) bt
#0  0x0000000000f30308 in i2p::datagram::DatagramDestination::SendDatagramTo(unsigned char const*, unsigned long, i2p::data::Tag<32ul> const&, unsigned short, unsigned short) ()
#1  0x000000000106cac5 in i2p::client::SAMBridge::HandleReceivedDatagram(boost::system::error_code const&, unsigned long) ()
#2  0x00000000010859e2 in void std::_Mem_fn_base<void (i2p::client::SAMBridge::*)(boost::system::error_code const&, unsigned long), true>::operator()<boost::system::error_code const&, unsigned long const&, void>(i2p::client::SAMBridge*, boost::system::error_code const&, unsigned long const&) const ()
#3  0x0000000001085631 in void std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)(boost::system::error_code const&, unsigned long)> (i2p::client::SAMBridge*, std::_Placeholder<1>, std::_Placeholder<2>)>::__call<void, boost::system::error_code const&, unsigned long const&, 0ul, 1ul, 2ul>(std::tuple<boost::system::error_code const&, unsigned long const&>&&, std::_Index_tuple<0ul, 1ul, 2ul>) ()
#4  0x00000000010850e3 in void std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)(boost::system::error_code const&, unsigned long)> (i2p::client::SAMBridge*, std::_Placeholder<1>, std::_Placeholder<2>)>::operator()<boost::system::error_code const&, unsigned long const&, void>(boost::system::error_code const&, unsigned long const&) ()
#5  0x0000000001084b67 in boost::asio::detail::binder2<std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)(boost::system::error_code const&, unsigned long)> (i2p::client::SAMBridge*, std::_Placeholder<1>, std::_Placeholder<2>)>, boost::system::error_code, unsigned long>::operator()() ()
#6  0x0000000001083f09 in void boost::asio::asio_handler_invoke<boost::asio::detail::binder2<std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)(boost::system::error_code const&, unsigned long)> (i2p::client::SAMBridge*, std::_Placeholder<1>, std::_Placeholder<2>)>, boost::system::error_code, unsigned long> >(boost::asio::detail::binder2<std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)(boost::system::error_code const&, unsigned long)> (i2p::client::SAMBridge*, std::_Placeholder<1>, std::_Placeholder<2>)>, boost::system::error_code, unsigned long>&, ...) ()
#7  0x0000000001082c41 in void boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)(boost::system::error_code const&, unsigned long)> (i2p::client::SAMBridge*, std::_Placeholder<1>, std::_Placeholder<2>)>, boost::system::error_code, unsigned long>, std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)(boost::system::error_code const&, unsigned long)> (i2p::client::SAMBridge*, std::_Placeholder<1>, std::_Placeholder<2>)> >(boost::asio::detail::binder2<std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)(boost::system::error_code const&, unsigned long)> (i2p::client::SAMBridge*, std::_Placeholder<1>, std::_Placeholder<2>)>, boost::system::error_code, unsigned long>&, std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)(boost::system::error_code const&, unsigned long)> (i2p::client::SAMBridge*, std::_Placeholder<1>, std::_Placeholder<2>)>&) ()
#8  0x0000000001080f7b in boost::asio::detail::reactive_socket_recvfrom_op<boost::asio::mutable_buffers_1, boost::asio::ip::basic_endpoint<boost::asio::ip::udp>, std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)(boost::system::error_code const&, unsigned long)> (i2p::client::SAMBridge*, std::_Placeholder<1>, std::_Placeholder<2>)> >::do_complete(boost::asio::detail::task_io_service*, boost::asio::detail::task_io_service_operation*, boost::system::error_code const&, unsigned long) ()
#9  0x0000000000d80c46 in boost::asio::detail::task_io_service_operation::complete(boost::asio::detail::task_io_service&, boost::system::error_code const&, unsigned long) ()
#10 0x0000000000d82a27 in boost::asio::detail::epoll_reactor::descriptor_state::do_complete(boost::asio::detail::task_io_service*, boost::asio::detail::task_io_service_operation*, boost::system::error_code const&, unsigned long) ()
#11 0x0000000000d80c46 in boost::asio::detail::task_io_service_operation::complete(boost::asio::detail::task_io_service&, boost::system::error_code const&, unsigned long) ()
#12 0x0000000000d835f1 in boost::asio::detail::task_io_service::do_run_one(boost::asio::detail::scoped_lock<boost::asio::detail::posix_mutex>&, boost::asio::detail::task_io_service_thread_info&, boost::system::error_code const&) ()
#13 0x0000000000d83075 in boost::asio::detail::task_io_service::run(boost::system::error_code&) ()
#14 0x0000000000d83900 in boost::asio::io_service::run() ()
#15 0x000000000106b7e8 in i2p::client::SAMBridge::Run() ()
#16 0x0000000001086503 in void std::_Mem_fn_base<void (i2p::client::SAMBridge::*)(), true>::operator()<, void>(i2p::client::SAMBridge*) const ()
#17 0x0000000001086465 in void std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)()> (i2p::client::SAMBridge*)>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) ()
#18 0x00000000010863bb in void std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)()> (i2p::client::SAMBridge*)>::operator()<, void>() ()
#19 0x0000000001086380 in void std::_Bind_simple<std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)()> (i2p::client::SAMBridge*)> ()>::_M_invoke<>(std::_Index_tuple<>) ()
#20 0x000000000108625c in std::_Bind_simple<std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)()> (i2p::client::SAMBridge*)> ()>::operator()() ()
#21 0x000000000108612c in std::thread::_Impl<std::_Bind_simple<std::_Bind<std::_Mem_fn<void (i2p::client::SAMBridge::*)()> (i2p::client::SAMBridge*)> ()> >::_M_run() ()
#22 0x00007ffff699ac80 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#23 0x00007ffff64b66ba in start_thread (arg=0x7fffdeffd700) at pthread_create.c:333
#24 0x00007ffff61ec41d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109

This should be straightforward to reproduce; if I can provide more info, please let me know.

About this issue

  • Original URL
  • State: open
  • Created 5 years ago
  • Comments: 44 (21 by maintainers)

Most upvoted comments

Let me check what it does in case of multiple datagram sessions

@benediamond you may try to update this script to use current versions of boost, zlib and openssl. See if it helps.

try now. if still doesn’t work try to find out if corresponding garlic even reaches server

I will try to debug by myself first. Maybe I have missed something

i2pd doesn’t support raw datagramms yet. There was no demand for it. I will try to implement.