Comments (20)
Hmm, quite strange. I don't think this is your issue but you need to add cp::sync_wait(chl.flush());
to the end of your functions. The Boost Asio Socket is asynchronous and sends data in the "background", to make sure all data is written you need to await on flush
. Once I added this, all your examples worked fine for me. So let's first make sure this isn't your issue. I don't think it is because if it was libOTe would be printing a message telling you to use flush
and then calling std::terminate()
. However, you see a crash. Moreover, the other example I sent you wouldn't have this issue and you are still crashing.
So there is no "multi-threading" per se, instead, libOTe uses coroutines. Essentially, what libote does is create a new class for each function with a MC_BEGIN
. This class saves the state of the function. The advantage of this is that a function can be paused aka suspended, i.e. the MC_AWAIT
macros pause the current function until the dependent task has been completed. This allows you to run many protocols all on a single thread/socket or split them across many threads depending on what you want. Not super helpful in your case but it can be. MC_BEGIN
simply creates the class where the function's data will be stored. You can see here for more details if you are interested.
https://ladnir.github.io/blog/2022/01/24/macoro.html
https://github.com/Visa-Research/coproto/blob/main/frontend/cpp14Tutorial.cpp
This class that MC_BEGIN
defines is a macoro::Frame<T>
where T
is a lambda function that is the main body of the function. When a function is being resumed, we have a pointer to macoro::Frame<T>
which essentially has a method on it called resume
. It appears that the program is crashing on this resume call, presumable because the point to the frame has somehow been corrupted. What has me questioning it being an actual problem with the correlated OT code is that your first set of stack traces has a similar crash but in AsmSimplestOT
. This happens waayyy before the correlated OT code. Whats more weird is that your second stack trace seems to have crashed in a similar place but in the correlated OT when its returning from IKNP receiver. In particular, it looks like its trying to destroy the macoro::Frame<T>
for the IknpOtExtReceiver::receive
coroutine/function and is crashing.
To debug this lets make a couple of other changes. So since you are using Boost::Asio networking, there actually are some background threads associated with boost. When debugging this, I suggest we remove these by using a coproto::LocalAsyncSocket
. See the code below. Make sure this code is also crashing for you.
So I'm still not sure what's going wrong. It seems likely there is some bug on my side. To get a bit more confidence in this I suggest you paste the code below into libOTe/frontend/main.cpp
and check that it still crashes. That way we can be sure it's not some bad interaction between your executable and the library. Given that the unit test passes, this might be the issue.
Assuming that still doesn't work, then I suggest building libOTe with debug symbols and or in debug mode, i.e. python3 build.py -DCMAKE_BUILD_TYPE=RelWithDebInfo
or python3 build.py -DCMAKE_BUILD_TYPE=Debug
. Then attach gdb to it and see exactly where it is crashing and what the state is. In particular, assuming you add the code below to libOTe/frontend/main.cpp
, then you would do
gdb out/build/linux/frontend/libOTe_frontend
r
Once it crashes, you can get the stack trace with the bt
command.
The example without threads & Boost Asio:
#include "coproto/Socket/AsioSocket.h"
#include "cryptoTools/Common/CLP.h"
#include "libOTe/Base/BaseOT.h"
#include "libOTe/TwoChooseOne/Iknp/IknpOtExtReceiver.h"
#include "libOTe/TwoChooseOne/Iknp/IknpOtExtSender.h"
#include "libOTe/TwoChooseOne/Kos/KosOtExtReceiver.h"
#include "libOTe/TwoChooseOne/Kos/KosOtExtSender.h"
using namespace osuCrypto;
using namespace std;
const u64 totalOTs = 1024;
const bool correlated = false; // !!! DOES NOT WORK WHEN TRUE !!!
const bool fake = true;
void senderReceiver() {
auto chl = cp::LocalAsyncSocket::makePair();
PRNG sPrng(sysRandomSeed());
PRNG rPrng(sysRandomSeed());
IknpOtExtSender sender;
IknpOtExtReceiver receiver;
if (fake) {
PRNG commonPRNG(oc::ZeroBlock);
std::array<std::array<block, 2>, 128> sendMsgs;
commonPRNG.get(sendMsgs.data(), sendMsgs.size());
BitVector bv(128);
bv.randomize(commonPRNG);
std::array<block, 128> recvMsgs;
for (u64 i = 0; i < 128; ++i) recvMsgs[i] = sendMsgs[i][bv[i]];
receiver.setBaseOts(sendMsgs);
sender.setBaseOts(recvMsgs, bv);
}
if (correlated)
{
oc::AlignedUnVector<block> sMsgs(totalOTs);
sPrng.get(sMsgs.data(), sMsgs.size());
// construct the choices that we want.
BitVector choice(totalOTs);
// in this case pick random messages.
choice.randomize(rPrng);
// construct a vector to stored the received messages.
oc::AlignedUnVector<block> rMsgs(totalOTs);
auto cor = [](block m0, u64 i) { return m0; };
cout << "OK" << endl;
cp::sync_wait(macoro::when_all_ready(
sender.sendCorrelated(
sMsgs, cor, sPrng, chl[0]),
receiver.receiveCorrelated(choice, rMsgs, rPrng, chl[1]))
);
cout << "send { " << sMsgs[0] << ", " << cor(sMsgs[0], 0) << "}, recv " << choice[0] << " " << rMsgs[0] << endl;
}
else {
// construct a vector to stored the random send messages.
oc::AlignedUnVector<array<block, 2>> sMsgs(totalOTs);
// Populate msgs with something useful...
sPrng.get(sMsgs.data(), sMsgs.size());
// construct a vector to stored the received messages.
oc::AlignedUnVector<block> rMsgs(totalOTs);
// construct the choices that we want.
BitVector choice(totalOTs);
// in this case pick random messages.
choice.randomize(rPrng);
// perform the OTs. The receiver will learn one
// of the messages stored in msgs.
cp::sync_wait(macoro::when_all_ready(
sender.sendChosen(sMsgs, sPrng, chl[0]),
receiver.receiveChosen(choice, rMsgs, sPrng, chl[1])
));
cout << "send {" << sMsgs[0][0] << ", " << sMsgs[0][1] << "}, recv " << choice[0] <<" " << rMsgs[0] << endl;
}
std::cout << "done" << std::endl;
}
int main(int argc, char** argv) {
senderReceiver();
}
from libote.
yeah, so libOTe is somewhat flexible in how it can be found.
Personally i never install anything as that is forcing all projects to use that version. Instead, I always install to some project-specific location, in my case out/install/<config>
But libOTe also allows you to simply point libOTe at where it repo is and it will handle the rest.
Well glad its somewhat working. You can uninstall libOTe by looking at whats in out/install/linux/
and removing those folders from wherever you installed to.
from libote.
Does the following work for you?
auto chl = coproto::LocalAsyncSocket::makePair();
PRNG prng(sysRandomSeed());
KosOtExtSender sender;
KosOtExtReceiver receiver;
vector<block> cMsgs(totalOTs);
prng.get(cMsgs.data(), cMsgs.size());
// construct the choices that we want.
BitVector choice(totalOTs);
// in this case pick random messages.
choice.randomize(prng);
// construct a vector to stored the received messages.
std::vector<block> rMsgs(totalOTs);
cp::sync_wait(macoro::when_all_ready(
sender.sendCorrelated(cMsgs, [](block m0, u64 i) { return m0; }, prng, chl[0]),
receiver.receiveCorrelated(choice, rMsgs, prng, chl[1])));
cout << "send" << cMsgs[0] << endl;
cout << "choice " << choice[0] << endl;
cout << rMsgs[0] << endl;
from libote.
Does the following work for you?
auto chl = coproto::LocalAsyncSocket::makePair(); PRNG prng(sysRandomSeed()); KosOtExtSender sender; KosOtExtReceiver receiver; vector<block> cMsgs(totalOTs); prng.get(cMsgs.data(), cMsgs.size()); // construct the choices that we want. BitVector choice(totalOTs); // in this case pick random messages. choice.randomize(prng); // construct a vector to stored the received messages. std::vector<block> rMsgs(totalOTs); cp::sync_wait(macoro::when_all_ready( sender.sendCorrelated(cMsgs, [](block m0, u64 i) { return m0; }, prng, chl[0]), receiver.receiveCorrelated(choice, rMsgs, prng, chl[1]))); cout << "send" << cMsgs[0] << endl; cout << "choice " << choice[0] << endl; cout << rMsgs[0] << endl;
No, I still got segmentation fault:
vscode ➜ /workspaces/cpp/vole/build $ ./vole
[1] 888 segmentation fault ./vole
vscode ➜ /workspaces/cpp/vole/build $ valgrind ./vole
==999== Memcheck, a memory error detector
==999== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==999== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==999== Command: ./vole
==999==
==999== Invalid read of size 8
==999== at 0x442E80: macoro::Frame<osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999== by 0x456A4E: macoro::Frame<osuCrypto::OtExtSender::genBaseOts(osuCrypto::OtReceiver&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999== by 0x40C9E5: macoro::coroutine_handle<void>::resume() const [clone .isra.0] (coro_frame.h:821)
==999== by 0x41CF85: coproto::LocalAsyncSocket::Awaiter::await_suspend(macoro::coroutine_handle<void>) (LocalAsyncSock.h:543)
==999== by 0x40D0C8: auto macoro::await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::detail::task_promise<void, false> >(coproto::LocalAsyncSocket::Awaiter&, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, std::enable_if<(!macoro::has_void_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value)&&(!macoro::has_bool_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value), macoro::empty_state>::type) [clone .isra.0] (coro_frame.h:152)
==999== by 0x435998: macoro::task<void, false> coproto::internal::SockScheduler::receiveDataTask<coproto::LocalAsyncSocket::Sock>(coproto::LocalAsyncSocket::Sock*)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, false> >*)#1}::operator()(macoro::FrameBase<macoro::detail::task_promise<void, false> >*) (SocketScheduler.h:799)
==999== by 0x428B25: std::enable_if<!std::is_void<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>::value, macoro::detail::blocking_task<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >::type macoro::detail::make_blocking_task<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&, std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>(macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&)::{lambda(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*)#1}::operator()(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*) (coro_frame.h:850)
==999== by 0x40AAED: resume (coro_frame.h:850)
==999== by 0x40AAED: start (sync_wait.h:123)
==999== by 0x40AAED: sync_wait<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > > > (sync_wait.h:186)
==999== by 0x40AAED: main (main.cpp:138)
==999== Address 0x4e6b6f8 is 8 bytes before a block of size 40 alloc'd
==999== at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==999== by 0x423416: allocate (new_allocator.h:115)
==999== by 0x423416: allocate (allocator.h:173)
==999== by 0x423416: allocate (alloc_traits.h:460)
==999== by 0x423416: _M_allocate (stl_vector.h:346)
==999== by 0x423416: _M_allocate (stl_vector.h:343)
==999== by 0x423416: void std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> >::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters*, std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> > >) (vector.tcc:440)
==999== by 0x4440E8: macoro::Frame<osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999== by 0x442B79: osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&) (in /workspaces/cpp/vole/build/vole)
==999== by 0x456991: macoro::Frame<osuCrypto::OtExtSender::genBaseOts(osuCrypto::OtReceiver&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999== by 0x428B05: std::enable_if<!std::is_void<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>::value, macoro::detail::blocking_task<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >::type macoro::detail::make_blocking_task<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&, std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>(macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&)::{lambda(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*)#1}::operator()(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*) (coro_frame.h:850)
==999== by 0x40AAED: resume (coro_frame.h:850)
==999== by 0x40AAED: start (sync_wait.h:123)
==999== by 0x40AAED: sync_wait<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > > > (sync_wait.h:186)
==999== by 0x40AAED: main (main.cpp:138)
==999==
==999== Invalid read of size 8
==999== at 0x442E84: macoro::Frame<osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999== by 0x456A4E: macoro::Frame<osuCrypto::OtExtSender::genBaseOts(osuCrypto::OtReceiver&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999== by 0x40C9E5: macoro::coroutine_handle<void>::resume() const [clone .isra.0] (coro_frame.h:821)
==999== by 0x41CF85: coproto::LocalAsyncSocket::Awaiter::await_suspend(macoro::coroutine_handle<void>) (LocalAsyncSock.h:543)
==999== by 0x40D0C8: auto macoro::await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::detail::task_promise<void, false> >(coproto::LocalAsyncSocket::Awaiter&, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, std::enable_if<(!macoro::has_void_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value)&&(!macoro::has_bool_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value), macoro::empty_state>::type) [clone .isra.0] (coro_frame.h:152)
==999== by 0x435998: macoro::task<void, false> coproto::internal::SockScheduler::receiveDataTask<coproto::LocalAsyncSocket::Sock>(coproto::LocalAsyncSocket::Sock*)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, false> >*)#1}::operator()(macoro::FrameBase<macoro::detail::task_promise<void, false> >*) (SocketScheduler.h:799)
==999== by 0x428B25: std::enable_if<!std::is_void<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>::value, macoro::detail::blocking_task<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >::type macoro::detail::make_blocking_task<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&, std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>(macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&)::{lambda(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*)#1}::operator()(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*) (coro_frame.h:850)
==999== by 0x40AAED: resume (coro_frame.h:850)
==999== by 0x40AAED: start (sync_wait.h:123)
==999== by 0x40AAED: sync_wait<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > > > (sync_wait.h:186)
==999== by 0x40AAED: main (main.cpp:138)
==999== Address 0x4e6b6f0 is 16 bytes before a block of size 40 alloc'd
==999== at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==999== by 0x423416: allocate (new_allocator.h:115)
==999== by 0x423416: allocate (allocator.h:173)
==999== by 0x423416: allocate (alloc_traits.h:460)
==999== by 0x423416: _M_allocate (stl_vector.h:346)
==999== by 0x423416: _M_allocate (stl_vector.h:343)
==999== by 0x423416: void std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> >::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters*, std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> > >) (vector.tcc:440)
==999== by 0x4440E8: macoro::Frame<osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999== by 0x442B79: osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&) (in /workspaces/cpp/vole/build/vole)
==999== by 0x456991: macoro::Frame<osuCrypto::OtExtSender::genBaseOts(osuCrypto::OtReceiver&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999== by 0x428B05: std::enable_if<!std::is_void<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>::value, macoro::detail::blocking_task<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >::type macoro::detail::make_blocking_task<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&, std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>(macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&)::{lambda(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*)#1}::operator()(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*) (coro_frame.h:850)
==999== by 0x40AAED: resume (coro_frame.h:850)
==999== by 0x40AAED: start (sync_wait.h:123)
==999== by 0x40AAED: sync_wait<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > > > (sync_wait.h:186)
==999== by 0x40AAED: main (main.cpp:138)
==999==
==999== Jump to the invalid address stated on the next line
==999== at 0x0: ???
==999== by 0x442E87: macoro::Frame<osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999== by 0x456A4E: macoro::Frame<osuCrypto::OtExtSender::genBaseOts(osuCrypto::OtReceiver&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999== by 0x40C9E5: macoro::coroutine_handle<void>::resume() const [clone .isra.0] (coro_frame.h:821)
==999== by 0x41CF85: coproto::LocalAsyncSocket::Awaiter::await_suspend(macoro::coroutine_handle<void>) (LocalAsyncSock.h:543)
==999== by 0x40D0C8: auto macoro::await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::detail::task_promise<void, false> >(coproto::LocalAsyncSocket::Awaiter&, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, std::enable_if<(!macoro::has_void_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value)&&(!macoro::has_bool_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value), macoro::empty_state>::type) [clone .isra.0] (coro_frame.h:152)
==999== by 0x435998: macoro::task<void, false> coproto::internal::SockScheduler::receiveDataTask<coproto::LocalAsyncSocket::Sock>(coproto::LocalAsyncSocket::Sock*)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, false> >*)#1}::operator()(macoro::FrameBase<macoro::detail::task_promise<void, false> >*) (SocketScheduler.h:799)
==999== by 0x428B25: std::enable_if<!std::is_void<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>::value, macoro::detail::blocking_task<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >::type macoro::detail::make_blocking_task<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&, std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>(macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&)::{lambda(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*)#1}::operator()(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*) (coro_frame.h:850)
==999== by 0x40AAED: resume (coro_frame.h:850)
==999== by 0x40AAED: start (sync_wait.h:123)
==999== by 0x40AAED: sync_wait<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > > > (sync_wait.h:186)
==999== by 0x40AAED: main (main.cpp:138)
==999== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==999==
==999==
==999== Process terminating with default action of signal 11 (SIGSEGV)
==999== Bad permissions for mapped region at address 0x0
==999== at 0x0: ???
==999== by 0x442E87: macoro::Frame<osuCrypto::AsmSimplestOT::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999== by 0x456A4E: macoro::Frame<osuCrypto::OtExtSender::genBaseOts(osuCrypto::OtReceiver&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==999== by 0x40C9E5: macoro::coroutine_handle<void>::resume() const [clone .isra.0] (coro_frame.h:821)
==999== by 0x41CF85: coproto::LocalAsyncSocket::Awaiter::await_suspend(macoro::coroutine_handle<void>) (LocalAsyncSock.h:543)
==999== by 0x40D0C8: auto macoro::await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::detail::task_promise<void, false> >(coproto::LocalAsyncSocket::Awaiter&, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, std::enable_if<(!macoro::has_void_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value)&&(!macoro::has_bool_await_suspend<coproto::LocalAsyncSocket::Awaiter, macoro::coroutine_handle<macoro::detail::task_promise<void, false> >, void>::value), macoro::empty_state>::type) [clone .isra.0] (coro_frame.h:152)
==999== by 0x435998: macoro::task<void, false> coproto::internal::SockScheduler::receiveDataTask<coproto::LocalAsyncSocket::Sock>(coproto::LocalAsyncSocket::Sock*)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, false> >*)#1}::operator()(macoro::FrameBase<macoro::detail::task_promise<void, false> >*) (SocketScheduler.h:799)
==999== by 0x428B25: std::enable_if<!std::is_void<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>::value, macoro::detail::blocking_task<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >::type macoro::detail::make_blocking_task<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&, std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&>(macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > >&&)::{lambda(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*)#1}::operator()(macoro::FrameBase<macoro::detail::blocking_promise<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> >&&> >*) (coro_frame.h:850)
==999== by 0x40AAED: resume (coro_frame.h:850)
==999== by 0x40AAED: start (sync_wait.h:123)
==999== by 0x40AAED: sync_wait<macoro::detail::when_all_ready_awaitable<std::tuple<macoro::detail::when_all_task<void>, macoro::detail::when_all_task<void> > > > (sync_wait.h:186)
==999== by 0x40AAED: main (main.cpp:138)
==999==
==999== HEAP SUMMARY:
==999== in use at exit: 9,339,128 bytes in 96 blocks
==999== total heap usage: 647 allocs, 551 frees, 9,468,872 bytes allocated
==999==
==999== LEAK SUMMARY:
==999== definitely lost: 0 bytes in 0 blocks
==999== indirectly lost: 0 bytes in 0 blocks
==999== possibly lost: 9,297,856 bytes in 50 blocks
==999== still reachable: 41,272 bytes in 46 blocks
==999== suppressed: 0 bytes in 0 blocks
==999== Rerun with --leak-check=full to see details of leaked memory
==999==
==999== For lists of detected and suppressed errors, rerun with: -s
==999== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
[1] 999 segmentation fault valgrind ./vole
My g++ version is g++ (Debian 10.2.1-6) 10.2.1 20210110
and compiled with -std=c++20 -mssse3 -maes -pthread -Wall -O2 -g
, I tried remove -O2
but still got same segmentation fault.
from libote.
What happens when you run the unit tests of frontend_libOTe? Should be
out/build/linux/frontend_libOTe/frontend_libOTe -u
from libote.
It skipped a few and passed others.
vscode ➜ .../out/build/linux/frontend (master) $ ./frontend_libOTe -u
0 - BtNetwork_SBO_ptr_test Passed 0ms
1 - BtNetwork_Connect1_Test Passed 5ms
2 - BtNetwork_RapidConnect_Test Passed 95ms
3 - BtNetwork_shutdown_test Passed 4ms
4 - BtNetwork_SocketInterface_Test Passed 21ms
5 - BtNetwork_OneMegabyteSend_Test Passed 5ms
6 - BtNetwork_ConnectMany_Test Passed 44ms
7 - BtNetwork_CrossConnect_Test Passed 6ms
8 - BtNetwork_ManySessions_Test Passed 41ms
9 - BtNetwork_bitVector_Test Passed 3ms
10 - BtNetwork_AsyncConnect_Test Passed 2ms
11 - BtNetwork_std_Containers_Test Passed 3ms
12 - BtNetwork_recvErrorHandler_Test Passed 4ms
13 - BtNetwork_closeOnError_Test Passed 8ms
14 - BtNetwork_AnonymousMode_Test Passed 7ms
15 - BtNetwork_CancelChannel_Test Passed 128ms
16 - BtNetwork_useAfterCancel_test Passed 4ms
17 - BtNetwork_fastCancel Passed 26ms
18 - BtNetwork_ServerMode_Test Passed 72ms
19 - BtNetwork_clientClose_Test Passed 93ms
20 - BtNetwork_BadConnect_Test Passed 3ms
21 - BtNetwork_oneWorker_Test Passed 0ms
22 - BtNetwork_queue_Test Passed 0ms
23 - BtNetwork_socketAdapter_test Passed 0ms
24 - BtNetwork_BasicSocket_test Passed 5ms
25 - wolfSSL_echoServer_test Skipped - ENABLE_WOLFSSL not defined 0ms
26 - wolfSSL_mutualAuth_test Skipped - ENABLE_WOLFSSL not defined 0ms
27 - wolfSSL_channel_test Skipped - ENABLE_WOLFSSL not defined 0ms
28 - wolfSSL_CancelChannel_Test Skipped - ENABLE_WOLFSSL not defined 0ms
29 - block_operation_test Passed 0ms
30 - AES Passed 0ms
31 - Rijndael256 Passed 0ms
32 - BitVector_Indexing_Test Passed 0ms
33 - BitVector_Parity Passed 0ms
34 - BitVector_Append_Test Passed 0ms
35 - BitVector_Copy_Test Passed 0ms
36 - BitVector_Resize_Test Passed 0ms
37 - CuckooIndex_many_Test Passed 0ms
38 - CuckooIndex_paramSweep_Test Passed 51ms
39 - CuckooIndex_parallel_Test Passed 0ms
40 - REccpNumber_Test Skipped - ENABLE_RELIC not defined. 0ms
41 - REccpPoint_Test Skipped - ENABLE_RELIC not defined. 0ms
42 - BetaCircuit_SequentialOp_Test Skipped - ENABLE_CIRCUITS not defined 0ms
43 - BetaCircuit_int_Adder_Test Skipped - ENABLE_CIRCUITS not defined 0ms
44 - BetaCircuit_int_Adder_const_Test Skipped - ENABLE_CIRCUITS not defined 0ms
45 - BetaCircuit_int_Subtractor_Test Skipped - ENABLE_CIRCUITS not defined 0ms
46 - BetaCircuit_int_Subtractor_const_Test Skipped - ENABLE_CIRCUITS not defined 0ms
47 - BetaCircuit_uint_Adder_Test Skipped - ENABLE_CIRCUITS not defined 0ms
48 - BetaCircuit_uint_Subtractor_Test Skipped - ENABLE_CIRCUITS not defined 0ms
49 - BetaCircuit_int_Multiply_Test Skipped - ENABLE_CIRCUITS not defined 0ms
50 - BetaCircuit_uint_Multiply_Test Skipped - ENABLE_CIRCUITS not defined 0ms
51 - BetaCircuit_int_LessThan_Test Skipped - ENABLE_CIRCUITS not defined 0ms
52 - BetaCircuit_int_GreaterThanEq_Test Skipped - ENABLE_CIRCUITS not defined 0ms
53 - BetaCircuit_uint_LessThan_Test Skipped - ENABLE_CIRCUITS not defined 0ms
54 - BetaCircuit_uint_GreaterThanEq_Test Skipped - ENABLE_CIRCUITS not defined 0ms
55 - BetaCircuit_negate_Test Skipped - ENABLE_CIRCUITS not defined 0ms
56 - BetaCircuit_bitInvert_Test Skipped - ENABLE_CIRCUITS not defined 0ms
57 - BetaCircuit_removeSign_Test Skipped - ENABLE_CIRCUITS not defined 0ms
58 - BetaCircuit_addSign_Test Skipped - ENABLE_CIRCUITS not defined 0ms
59 - BetaCircuit_int_Divide_Test Skipped - ENABLE_CIRCUITS not defined 0ms
60 - BetaCircuit_multiplex_Test Skipped - ENABLE_CIRCUITS not defined 0ms
61 - BetaCircuit_json_Tests Skipped - ENABLE_CIRCUITS not defined 0ms
62 - BetaCircuit_bin_Tests Skipped - ENABLE_CIRCUITS not defined 0ms
63 - BetaCircuit_xor_and_lvl_test Skipped - ENABLE_CIRCUITS not defined 0ms
64 - BetaCircuit_aes_test Skipped - ENABLE_CIRCUITS must be defined. 0ms
65 - Tools_Transpose_Test Passed 0ms
66 - Tools_Transpose_View_Test Passed 0ms
67 - Tools_Transpose_Bench Passed 1ms
68 - Tools_LinearCode_Test Passed 0ms
69 - Tools_LinearCode_sub_Test Passed 0ms
70 - Tools_LinearCode_rep_Test Passed 0ms
71 - Tools_bitShift_test Passed 0ms
72 - Tools_modp_test Passed 0ms
73 - Tools_bitpolymul_test Passed 8ms
74 - Tools_quasiCyclic_test Passed 253ms
75 - Mtx_make_test Passed 2ms
76 - Mtx_add_test Passed 0ms
77 - Mtx_mult_test Passed 0ms
78 - Mtx_invert_test Passed 0ms
79 - EACode_encode_basic_test Passed 1ms
80 - ExConvCode_encode_basic_test Passed 0ms
81 - Tools_Pprf_test Passed 0ms
82 - Tools_Pprf_trans_test Passed 0ms
83 - Tools_Pprf_inter_test Passed 0ms
84 - Tools_Pprf_blockTrans_test Passed 0ms
85 - Tools_Pprf_callback_test Passed 0ms
86 - Bot_Simplest_Test Passed 8ms
87 - Bot_Simplest_asm_Test Passed 4ms
88 - Bot_McQuoidRR_Moeller_EKE_Test Passed 10ms
89 - Bot_McQuoidRR_Moeller_MR_Test Passed 11ms
90 - Bot_McQuoidRR_Moeller_F_Test Passed 11ms
91 - Bot_McQuoidRR_Moeller_FM_Test Passed 11ms
92 - Bot_McQuoidRR_Ristrestto_F_Test Passed 16ms
93 - Bot_McQuoidRR_Ristrestto_FM_Test Passed 16ms
94 - Bot_MasnyRindal_Test Passed 17ms
95 - Bot_MasnyRindal_Kyber_Test Passed 6ms
96 - Vole_SoftSpokenSmall_Test Passed 93ms
97 - DotExt_Kos_Test Passed 2ms
98 - DotExt_Iknp_Test Passed 0ms
99 - OtExt_genBaseOts_Test Passed 7ms
100 - OtExt_Chosen_Test Passed 0ms
101 - OtExt_Iknp_Test Passed 0ms
102 - OtExt_Kos_Test Passed 0ms
103 - OtExt_Kos_fs_Test Passed 1ms
104 - OtExt_Kos_ro_Test Passed 11ms
105 - OtExt_Silent_random_Test Passed 1ms
106 - OtExt_Silent_correlated_Test Passed 2ms
107 - OtExt_Silent_inplace_Test Passed 15ms
108 - OtExt_Silent_paramSweep_Test Passed 195ms
109 - OtExt_Silent_QuasiCyclic_Test Passed 22ms
110 - OtExt_Silent_Silver_Test Skipped - ENABLE_SILENTOT or ENABLE_INSECURE_SILVER are not defined. 0ms
111 - OtExt_Silent_baseOT_Test Passed 7ms
112 - OtExt_Silent_mal_Test Passed 10ms
113 - OtExt_SoftSpokenSemiHonest_Test Passed 20ms
114 - OtExt_SoftSpokenSemiHonest_Split_Test Passed 0ms
115 - OtExt_SoftSpokenMalicious21_Test Passed 13ms
116 - OtExt_SoftSpokenMalicious21_Split_Test Passed 0ms
117 - DotExt_SoftSpokenMaliciousLeaky_Test Passed 13ms
118 - Vole_Noisy_test Passed 0ms
119 - Vole_Silent_QuasiCyclic_test Passed 75ms
120 - Vole_Silent_Silver_test Passed 0ms
121 - Vole_Silent_paramSweep_test Passed 12ms
122 - Vole_Silent_baseOT_test Passed 9ms
123 - Vole_Silent_mal_test Passed 10ms
124 - Vole_Silent_Rounds_test Passed 1051ms
125 - NcoOt_Kkrt_Test Passed 0ms
126 - NcoOt_Oos_Test Passed 2ms
127 - NcoOt_genBaseOts_Test Passed 8ms
=============================================
All Passed (98)
skipped (30)
=============================================
Also I didn't find any code calling sendCorrelated
or receiveCorrelated
.
from libote.
so you are crashing in ASM version of SimplestOT. Its my guess that this doesn't have to do with correlated OT. It run normal OT and then sends a few extra values. If it was a problem with correlated OT, then i wouldn't expect it to crash at the very start of the protocol before anything specific to correlated OT has been performed.
Did you purposefully enable the ASM version of simplest OT?
Can you disable it and then retry your test? python3 build.py -DENABLE_SIMPLESTOT_ASM=false
Since the unit tests are passing its my suspicion that there is some bad interaction between your library and the assembly code that simplestOT has.
from libote.
No, simplest OT is not the problem. I tried McRosRoyTwist
and MasnyRindal
as well, it was similar error. Also, it worked fine as long as I use the normal send and receive.
from libote.
I think there might be some issue with multithreading. I don't understand that library for MC_BEGIN
and MC_AWAIT
, and I am guessing there might be a problem:
// No extra alignment is required.
template<typename CorrelationFunc>
task<> sendCorrelated(span<block> messages, const CorrelationFunc& corFunc, PRNG& prng, Socket& chl)
{
MC_BEGIN(task<>,this, messages, &corFunc, &prng, &chl,
temp = AlignedUnVector<std::array<block, 2>>(messages.size()),
temp2 = AlignedUnVector<block>(messages.size())
);
MC_AWAIT(send(temp, prng, chl));
for (u64 i = 0; i < static_cast<u64>(messages.size()); ++i)
{
messages[i] = temp[i][0];
temp2[i] = temp[i][1] ^ corFunc(temp[i][0], i);
}
MC_AWAIT(chl.send(std::move(temp2)));
MC_END();
}
Here is my main.cpp
, it has segmentation fault when I set correlated
to true and works normally when false, regardless of (fake)base OT and Iknp/Kos. Does this code or the example your sent me work fine on your machine?
#include "coproto/Socket/AsioSocket.h"
#include "cryptoTools/Common/CLP.h"
#include "libOTe/Base/BaseOT.h"
#include "libOTe/TwoChooseOne/Iknp/IknpOtExtReceiver.h"
#include "libOTe/TwoChooseOne/Iknp/IknpOtExtSender.h"
#include "libOTe/TwoChooseOne/Kos/KosOtExtReceiver.h"
#include "libOTe/TwoChooseOne/Kos/KosOtExtSender.h"
using namespace osuCrypto;
using namespace std;
const u64 totalOTs = 1024;
const bool correlated = true; // !!! DOES NOT WORK WHEN TRUE !!!
const bool fake = false;
void sender() {
auto chl = cp::asioConnect("127.0.0.1:7700", true);
PRNG prng(sysRandomSeed());
IknpOtExtSender sender;
// KosOtExtSender sender;
cout << "OK" << endl;
if (fake) {
PRNG commonPRNG(oc::ZeroBlock);
std::array<std::array<block, 2>, 128> sendMsgs;
commonPRNG.get(sendMsgs.data(), sendMsgs.size());
BitVector bv(128);
bv.randomize(commonPRNG);
std::array<block, 128> recvMsgs;
for (u64 i = 0; i < 128; ++i) recvMsgs[i] = sendMsgs[i][bv[i]];
sender.setBaseOts(recvMsgs, bv);
} else {
DefaultBaseOT base;
BitVector bv(128);
std::array<block, 128> baseMsg;
bv.randomize(prng);
cout << "OK" << endl;
// perform the base To, call sync_wait to block until they have completed.
cp::sync_wait(base.receive(bv, baseMsg, prng, chl));
sender.setBaseOts(baseMsg, bv);
cout << "OK" << endl;
}
if (correlated) {
vector<block> cMsgs(totalOTs);
prng.get(cMsgs.data(), cMsgs.size());
cout << "OK" << endl;
cp::sync_wait(sender.sendCorrelated(
cMsgs, [](block m0, u64 i) { return m0; }, prng, chl));
cout << "send" << cMsgs[0] << endl;
} else {
// construct a vector to stored the random send messages.
vector<array<block, 2>> sMsgs(totalOTs);
// Populate msgs with something useful...
prng.get(sMsgs.data(), sMsgs.size());
// perform the OTs. The receiver will learn one
// of the messages stored in msgs.
cp::sync_wait(sender.sendChosen(sMsgs, prng, chl));
cout << "send 0 " << sMsgs[0][0] << endl;
cout << "send 1 " << sMsgs[0][1] << endl;
}
}
void receiver() {
auto chl = cp::asioConnect("127.0.0.1:7700", false);
PRNG prng(sysRandomSeed());
IknpOtExtReceiver receiver;
// KosOtExtReceiver receiver;
if (fake) {
PRNG commonPRNG(oc::ZeroBlock);
std::array<std::array<block, 2>, 128> sendMsgs;
commonPRNG.get(sendMsgs.data(), sendMsgs.size());
receiver.setBaseOts(sendMsgs);
} else {
DefaultBaseOT base;
std::array<std::array<block, 2>, 128> baseMsg;
// perform the base To, call sync_wait to block until they have completed.
cp::sync_wait(base.send(baseMsg, prng, chl));
receiver.setBaseOts(baseMsg);
}
// construct the choices that we want.
BitVector choice(totalOTs);
// in this case pick random messages.
choice.randomize(prng);
// construct a vector to stored the received messages.
std::vector<block> rMsgs(totalOTs);
if (correlated) {
cp::sync_wait(receiver.receiveCorrelated(choice, rMsgs, prng, chl));
} else {
// perform totalOTs chosen message OTs, the results will be written to
// msgs.
cp::sync_wait(receiver.receiveChosen(choice, rMsgs, prng, chl));
}
cout << "choice " << choice[0] << endl;
cout << rMsgs[0] << endl;
}
int main(int argc, char** argv) {
if (argc == 1) {
std::cout << "Usage: " << argv[0] << "0|1" << std::endl;
return 0;
}
if (argv[1][0] == '0') {
sender();
} else {
receiver();
}
}
from libote.
Can you give a stack trace of the crash with fake base OTs?
from libote.
And maybe try changing your vectors to oc::AlignedVector<... >
from libote.
Sure, here is the output and the code:
vscode ➜ /workspaces/cpp/vole/build $ valgrind ./vole 0
==2268== Memcheck, a memory error detector
==2268== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2268== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==2268== Command: ./vole 0
==2268==
OK
OK
==2268== Thread 2:
==2268== Invalid read of size 8
==2268== at 0x40709A: macoro::Frame<osuCrypto::IknpOtExtSender::send(nonstd::span_lite::span<std::array<osuCrypto::block, 2ul>, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) [clone .cold] (in /workspaces/cpp/vole/build/vole)
==2268== by 0x425C22: resume (coro_frame.h:821)
==2268== by 0x425C22: coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::callback(boost::system::error_code, unsigned long, coproto::detail::AsioLifetime::Lock, coproto::detail::AsioLifetime::Lock) (AsioSocket.h:446)
==2268== by 0x42633A: operator() (AsioSocket.h:506)
==2268== by 0x42633A: std::result_of<boost::system::error_code (boost::system const&, unsigned long const&)>::type boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot>::operator()<boost::system const&, unsigned long const&>((unsigned long const&)...) (bind_cancellation_slot.hpp:377)
==2268== by 0x426233: boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >::operator()(boost::system, unsigned long, int) (read.hpp:398)
==2268== by 0x426EFA: operator() (bind_handler.hpp:289)
==2268== by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_hook.hpp:88)
==2268== by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (handler_invoke_helpers.hpp:54)
==2268== by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (read.hpp:466)
==2268== by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > > (handler_invoke_helpers.hpp:54)
==2268== by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> (bind_handler.hpp:344)
==2268== by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_helpers.hpp:54)
==2268== by 0x426EFA: void boost::asio::detail::executor_function::complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, std::allocator<void> >(boost::asio::detail::executor_function::impl_base*, bool) (executor_function.hpp:116)
==2268== by 0x413017: operator() (executor_function.hpp:64)
==2268== by 0x413017: asio_handler_invoke<boost::asio::detail::executor_function> (handler_invoke_hook.hpp:88)
==2268== by 0x413017: invoke<boost::asio::detail::executor_function, boost::asio::detail::executor_function> (handler_invoke_helpers.hpp:54)
==2268== by 0x413017: boost::asio::detail::executor_op<boost::asio::detail::executor_function, std::allocator<void>, boost::asio::detail::scheduler_operation>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) (executor_op.hpp:70)
==2268== by 0x415C91: complete (scheduler_operation.hpp:40)
==2268== by 0x415C91: run_ready_handlers (strand_executor_service.ipp:150)
==2268== by 0x415C91: operator() (strand_executor_service.hpp:127)
==2268== by 0x415C91: asio_handler_invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_hook.hpp:88)
==2268== by 0x415C91: invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void>, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_helpers.hpp:54)
==2268== by 0x415C91: void boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u>::execute<boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void> >(boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void>&&) const (io_context.hpp:290)
==2268== by 0x4159EE: operator()<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> &, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (execute.hpp:208)
==2268== by 0x4159EE: void boost::asio::detail::strand_executor_service::do_execute<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, boost::asio::detail::executor_function, std::allocator<void> >(std::shared_ptr<boost::asio::detail::strand_executor_service::strand_impl> const&, boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const&, boost::asio::detail::executor_function&&, std::allocator<void> const&) (strand_executor_service.hpp:258)
==2268== by 0x415823: execute<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, boost::asio::detail::executor_function> (strand_executor_service.hpp:209)
==2268== by 0x415823: execute<boost::asio::detail::executor_function> (strand.hpp:287)
==2268== by 0x415823: operator()<const boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> > &, boost::asio::detail::executor_function> (execute.hpp:208)
==2268== by 0x415823: void boost::asio::execution::detail::any_executor_base::execute_ex<boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> > >(boost::asio::execution::detail::any_executor_base const&, boost::asio::detail::executor_function&&) (any_executor.hpp:889)
==2268== by 0x426D3A: void boost::asio::execution::detail::any_executor_base::execute<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long> >(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&&) const (any_executor.hpp:606)
==2268== by 0x426B92: operator()<boost::asio::any_io_executor, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (execute.hpp:208)
==2268== by 0x426B92: void boost::asio::detail::handler_work_base<boost::asio::any_io_executor, boost::asio::any_io_executor, boost::asio::io_context, boost::asio::executor, void>::dispatch<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, boost::asio::cancellation_slot>(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&, boost::asio::cancellation_slot&) (handler_work.hpp:439)
==2268== by 0x42680C: complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_work.hpp:480)
==2268== by 0x42680C: boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system const&, unsigned long) (reactive_socket_recv_op.hpp:145)
==2268== Address 0x4e9fd08 is 8 bytes before a block of size 40 alloc'd
==2268== at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2268== by 0x437035: allocate (new_allocator.h:115)
==2268== by 0x437035: allocate (allocator.h:173)
==2268== by 0x437035: allocate (alloc_traits.h:460)
==2268== by 0x437035: _M_allocate (stl_vector.h:346)
==2268== by 0x437035: void std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> >::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters*, std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> > >) (vector.tcc:440)
==2268== by 0x43C6E1: macoro::Frame<osuCrypto::IknpOtExtSender::send(nonstd::span_lite::span<std::array<osuCrypto::block, 2ul>, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2268== by 0x43B861: osuCrypto::IknpOtExtSender::send(nonstd::span_lite::span<std::array<osuCrypto::block, 2ul>, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&) (in /workspaces/cpp/vole/build/vole)
==2268== by 0x40AF31: operator() (OTExtInterface.h:88)
==2268== by 0x40AF31: macoro::Frame<macoro::task<void, true> osuCrypto::OtSender::sendCorrelated<sender()::$_0>(nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, sender()::$_0 const&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (coro_frame.h:612)
==2268== by 0x40BE15: resume (coro_frame.h:850)
==2268== by 0x40BE15: start (sync_wait.h:123)
==2268== by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2268== by 0x40A2E5: sender() (src/main.cpp:52)
==2268== by 0x40ACEC: main (src/main.cpp:116)
==2268==
==2268== Invalid read of size 8
==2268== at 0x40709E: macoro::Frame<osuCrypto::IknpOtExtSender::send(nonstd::span_lite::span<std::array<osuCrypto::block, 2ul>, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) [clone .cold] (in /workspaces/cpp/vole/build/vole)
==2268== by 0x425C22: resume (coro_frame.h:821)
==2268== by 0x425C22: coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::callback(boost::system::error_code, unsigned long, coproto::detail::AsioLifetime::Lock, coproto::detail::AsioLifetime::Lock) (AsioSocket.h:446)
==2268== by 0x42633A: operator() (AsioSocket.h:506)
==2268== by 0x42633A: std::result_of<boost::system::error_code (boost::system const&, unsigned long const&)>::type boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot>::operator()<boost::system const&, unsigned long const&>((unsigned long const&)...) (bind_cancellation_slot.hpp:377)
==2268== by 0x426233: boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >::operator()(boost::system, unsigned long, int) (read.hpp:398)
==2268== by 0x426EFA: operator() (bind_handler.hpp:289)
==2268== by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_hook.hpp:88)
==2268== by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (handler_invoke_helpers.hpp:54)
==2268== by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (read.hpp:466)
==2268== by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > > (handler_invoke_helpers.hpp:54)
==2268== by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> (bind_handler.hpp:344)
==2268== by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_helpers.hpp:54)
==2268== by 0x426EFA: void boost::asio::detail::executor_function::complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, std::allocator<void> >(boost::asio::detail::executor_function::impl_base*, bool) (executor_function.hpp:116)
==2268== by 0x413017: operator() (executor_function.hpp:64)
==2268== by 0x413017: asio_handler_invoke<boost::asio::detail::executor_function> (handler_invoke_hook.hpp:88)
==2268== by 0x413017: invoke<boost::asio::detail::executor_function, boost::asio::detail::executor_function> (handler_invoke_helpers.hpp:54)
==2268== by 0x413017: boost::asio::detail::executor_op<boost::asio::detail::executor_function, std::allocator<void>, boost::asio::detail::scheduler_operation>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) (executor_op.hpp:70)
==2268== by 0x415C91: complete (scheduler_operation.hpp:40)
==2268== by 0x415C91: run_ready_handlers (strand_executor_service.ipp:150)
==2268== by 0x415C91: operator() (strand_executor_service.hpp:127)
==2268== by 0x415C91: asio_handler_invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_hook.hpp:88)
==2268== by 0x415C91: invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void>, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_helpers.hpp:54)
==2268== by 0x415C91: void boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u>::execute<boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void> >(boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void>&&) const (io_context.hpp:290)
==2268== by 0x4159EE: operator()<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> &, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (execute.hpp:208)
==2268== by 0x4159EE: void boost::asio::detail::strand_executor_service::do_execute<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, boost::asio::detail::executor_function, std::allocator<void> >(std::shared_ptr<boost::asio::detail::strand_executor_service::strand_impl> const&, boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const&, boost::asio::detail::executor_function&&, std::allocator<void> const&) (strand_executor_service.hpp:258)
==2268== by 0x415823: execute<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, boost::asio::detail::executor_function> (strand_executor_service.hpp:209)
==2268== by 0x415823: execute<boost::asio::detail::executor_function> (strand.hpp:287)
==2268== by 0x415823: operator()<const boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> > &, boost::asio::detail::executor_function> (execute.hpp:208)
==2268== by 0x415823: void boost::asio::execution::detail::any_executor_base::execute_ex<boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> > >(boost::asio::execution::detail::any_executor_base const&, boost::asio::detail::executor_function&&) (any_executor.hpp:889)
==2268== by 0x426D3A: void boost::asio::execution::detail::any_executor_base::execute<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long> >(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&&) const (any_executor.hpp:606)
==2268== by 0x426B92: operator()<boost::asio::any_io_executor, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (execute.hpp:208)
==2268== by 0x426B92: void boost::asio::detail::handler_work_base<boost::asio::any_io_executor, boost::asio::any_io_executor, boost::asio::io_context, boost::asio::executor, void>::dispatch<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, boost::asio::cancellation_slot>(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&, boost::asio::cancellation_slot&) (handler_work.hpp:439)
==2268== by 0x42680C: complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_work.hpp:480)
==2268== by 0x42680C: boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system const&, unsigned long) (reactive_socket_recv_op.hpp:145)
==2268== Address 0x4e9fd00 is 16 bytes before a block of size 40 alloc'd
==2268== at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2268== by 0x437035: allocate (new_allocator.h:115)
==2268== by 0x437035: allocate (allocator.h:173)
==2268== by 0x437035: allocate (alloc_traits.h:460)
==2268== by 0x437035: _M_allocate (stl_vector.h:346)
==2268== by 0x437035: void std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> >::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters*, std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> > >) (vector.tcc:440)
==2268== by 0x43C6E1: macoro::Frame<osuCrypto::IknpOtExtSender::send(nonstd::span_lite::span<std::array<osuCrypto::block, 2ul>, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2268== by 0x43B861: osuCrypto::IknpOtExtSender::send(nonstd::span_lite::span<std::array<osuCrypto::block, 2ul>, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&) (in /workspaces/cpp/vole/build/vole)
==2268== by 0x40AF31: operator() (OTExtInterface.h:88)
==2268== by 0x40AF31: macoro::Frame<macoro::task<void, true> osuCrypto::OtSender::sendCorrelated<sender()::$_0>(nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, sender()::$_0 const&, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (coro_frame.h:612)
==2268== by 0x40BE15: resume (coro_frame.h:850)
==2268== by 0x40BE15: start (sync_wait.h:123)
==2268== by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2268== by 0x40A2E5: sender() (src/main.cpp:52)
==2268== by 0x40ACEC: main (src/main.cpp:116)
==2268==
==2268== Jump to the invalid address stated on the next line
==2268== at 0x0: ???
==2268== by 0x425C22: resume (coro_frame.h:821)
==2268== by 0x425C22: coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::callback(boost::system::error_code, unsigned long, coproto::detail::AsioLifetime::Lock, coproto::detail::AsioLifetime::Lock) (AsioSocket.h:446)
==2268== by 0x42633A: operator() (AsioSocket.h:506)
==2268== by 0x42633A: std::result_of<boost::system::error_code (boost::system const&, unsigned long const&)>::type boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot>::operator()<boost::system const&, unsigned long const&>((unsigned long const&)...) (bind_cancellation_slot.hpp:377)
==2268== by 0x426233: boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >::operator()(boost::system, unsigned long, int) (read.hpp:398)
==2268== by 0x426EFA: operator() (bind_handler.hpp:289)
==2268== by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_hook.hpp:88)
==2268== by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (handler_invoke_helpers.hpp:54)
==2268== by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (read.hpp:466)
==2268== by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > > (handler_invoke_helpers.hpp:54)
==2268== by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> (bind_handler.hpp:344)
==2268== by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_helpers.hpp:54)
==2268== by 0x426EFA: void boost::asio::detail::executor_function::complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, std::allocator<void> >(boost::asio::detail::executor_function::impl_base*, bool) (executor_function.hpp:116)
==2268== by 0x413017: operator() (executor_function.hpp:64)
==2268== by 0x413017: asio_handler_invoke<boost::asio::detail::executor_function> (handler_invoke_hook.hpp:88)
==2268== by 0x413017: invoke<boost::asio::detail::executor_function, boost::asio::detail::executor_function> (handler_invoke_helpers.hpp:54)
==2268== by 0x413017: boost::asio::detail::executor_op<boost::asio::detail::executor_function, std::allocator<void>, boost::asio::detail::scheduler_operation>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) (executor_op.hpp:70)
==2268== by 0x415C91: complete (scheduler_operation.hpp:40)
==2268== by 0x415C91: run_ready_handlers (strand_executor_service.ipp:150)
==2268== by 0x415C91: operator() (strand_executor_service.hpp:127)
==2268== by 0x415C91: asio_handler_invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_hook.hpp:88)
==2268== by 0x415C91: invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void>, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_helpers.hpp:54)
==2268== by 0x415C91: void boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u>::execute<boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void> >(boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void>&&) const (io_context.hpp:290)
==2268== by 0x4159EE: operator()<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> &, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (execute.hpp:208)
==2268== by 0x4159EE: void boost::asio::detail::strand_executor_service::do_execute<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, boost::asio::detail::executor_function, std::allocator<void> >(std::shared_ptr<boost::asio::detail::strand_executor_service::strand_impl> const&, boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const&, boost::asio::detail::executor_function&&, std::allocator<void> const&) (strand_executor_service.hpp:258)
==2268== by 0x415823: execute<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, boost::asio::detail::executor_function> (strand_executor_service.hpp:209)
==2268== by 0x415823: execute<boost::asio::detail::executor_function> (strand.hpp:287)
==2268== by 0x415823: operator()<const boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> > &, boost::asio::detail::executor_function> (execute.hpp:208)
==2268== by 0x415823: void boost::asio::execution::detail::any_executor_base::execute_ex<boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> > >(boost::asio::execution::detail::any_executor_base const&, boost::asio::detail::executor_function&&) (any_executor.hpp:889)
==2268== by 0x426D3A: void boost::asio::execution::detail::any_executor_base::execute<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long> >(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&&) const (any_executor.hpp:606)
==2268== by 0x426B92: operator()<boost::asio::any_io_executor, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (execute.hpp:208)
==2268== by 0x426B92: void boost::asio::detail::handler_work_base<boost::asio::any_io_executor, boost::asio::any_io_executor, boost::asio::io_context, boost::asio::executor, void>::dispatch<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, boost::asio::cancellation_slot>(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&, boost::asio::cancellation_slot&) (handler_work.hpp:439)
==2268== by 0x42680C: complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_work.hpp:480)
==2268== by 0x42680C: boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system const&, unsigned long) (reactive_socket_recv_op.hpp:145)
==2268== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==2268==
==2268==
==2268== Process terminating with default action of signal 11 (SIGSEGV)
==2268== Bad permissions for mapped region at address 0x0
==2268== at 0x0: ???
==2268== by 0x425C22: resume (coro_frame.h:821)
==2268== by 0x425C22: coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::callback(boost::system::error_code, unsigned long, coproto::detail::AsioLifetime::Lock, coproto::detail::AsioLifetime::Lock) (AsioSocket.h:446)
==2268== by 0x42633A: operator() (AsioSocket.h:506)
==2268== by 0x42633A: std::result_of<boost::system::error_code (boost::system const&, unsigned long const&)>::type boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot>::operator()<boost::system const&, unsigned long const&>((unsigned long const&)...) (bind_cancellation_slot.hpp:377)
==2268== by 0x426233: boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >::operator()(boost::system, unsigned long, int) (read.hpp:398)
==2268== by 0x426EFA: operator() (bind_handler.hpp:289)
==2268== by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_hook.hpp:88)
==2268== by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (handler_invoke_helpers.hpp:54)
==2268== by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > (read.hpp:466)
==2268== by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> > > (handler_invoke_helpers.hpp:54)
==2268== by 0x426EFA: asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> (bind_handler.hpp:344)
==2268== by 0x426EFA: invoke<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long>, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_invoke_helpers.hpp:54)
==2268== by 0x426EFA: void boost::asio::detail::executor_function::complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, std::allocator<void> >(boost::asio::detail::executor_function::impl_base*, bool) (executor_function.hpp:116)
==2268== by 0x413017: operator() (executor_function.hpp:64)
==2268== by 0x413017: asio_handler_invoke<boost::asio::detail::executor_function> (handler_invoke_hook.hpp:88)
==2268== by 0x413017: invoke<boost::asio::detail::executor_function, boost::asio::detail::executor_function> (handler_invoke_helpers.hpp:54)
==2268== by 0x413017: boost::asio::detail::executor_op<boost::asio::detail::executor_function, std::allocator<void>, boost::asio::detail::scheduler_operation>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) (executor_op.hpp:70)
==2268== by 0x415C91: complete (scheduler_operation.hpp:40)
==2268== by 0x415C91: run_ready_handlers (strand_executor_service.ipp:150)
==2268== by 0x415C91: operator() (strand_executor_service.hpp:127)
==2268== by 0x415C91: asio_handler_invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_hook.hpp:88)
==2268== by 0x415C91: invoke<boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void>, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (handler_invoke_helpers.hpp:54)
==2268== by 0x415C91: void boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u>::execute<boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void> >(boost::asio::detail::strand_executor_service::invoker<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, void>&&) const (io_context.hpp:290)
==2268== by 0x4159EE: operator()<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> &, boost::asio::detail::strand_executor_service::invoker<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, void> > (execute.hpp:208)
==2268== by 0x4159EE: void boost::asio::detail::strand_executor_service::do_execute<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const, boost::asio::detail::executor_function, std::allocator<void> >(std::shared_ptr<boost::asio::detail::strand_executor_service::strand_impl> const&, boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> const&, boost::asio::detail::executor_function&&, std::allocator<void> const&) (strand_executor_service.hpp:258)
==2268== by 0x415823: execute<const boost::asio::io_context::basic_executor_type<std::allocator<void>, 4>, boost::asio::detail::executor_function> (strand_executor_service.hpp:209)
==2268== by 0x415823: execute<boost::asio::detail::executor_function> (strand.hpp:287)
==2268== by 0x415823: operator()<const boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4> > &, boost::asio::detail::executor_function> (execute.hpp:208)
==2268== by 0x415823: void boost::asio::execution::detail::any_executor_base::execute_ex<boost::asio::strand<boost::asio::io_context::basic_executor_type<std::allocator<void>, 4u> > >(boost::asio::execution::detail::any_executor_base const&, boost::asio::detail::executor_function&&) (any_executor.hpp:889)
==2268== by 0x426D3A: void boost::asio::execution::detail::any_executor_base::execute<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long> >(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&&) const (any_executor.hpp:606)
==2268== by 0x426B92: operator()<boost::asio::any_io_executor, boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (execute.hpp:208)
==2268== by 0x426B92: void boost::asio::detail::handler_work_base<boost::asio::any_io_executor, boost::asio::any_io_executor, boost::asio::io_context, boost::asio::executor, void>::dispatch<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>, boost::asio::cancellation_slot>(boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::system, unsigned long>&, boost::asio::cancellation_slot&) (handler_work.hpp:439)
==2268== by 0x42680C: complete<boost::asio::detail::binder2<boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, const boost::asio::mutable_buffer *, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<(lambda at /usr/local/include/coproto/Socket/AsioSocket.h:501:9), boost::asio::cancellation_slot> >, boost::system::error_code, unsigned long> > (handler_work.hpp:480)
==2268== by 0x42680C: boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::asio::cancellation_slot_binder<coproto::detail::AsioSocket<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor> >::Awaiter::await_suspend(macoro::coroutine_handle<void>)::{lambda()#1}::operator()()::{lambda(boost::system::error_code, unsigned long)#2}, boost::asio::cancellation_slot> >, boost::asio::any_io_executor>::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system const&, unsigned long) (reactive_socket_recv_op.hpp:145)
==2268==
==2268== HEAP SUMMARY:
==2268== in use at exit: 1,131,692 bytes in 75 blocks
==2268== total heap usage: 138 allocs, 63 frees, 1,212,996 bytes allocated
==2268==
==2268== LEAK SUMMARY:
==2268== definitely lost: 0 bytes in 0 blocks
==2268== indirectly lost: 0 bytes in 0 blocks
==2268== possibly lost: 1,124,302 bytes in 18 blocks
==2268== still reachable: 7,390 bytes in 57 blocks
==2268== of which reachable via heuristic:
==2268== stdstring : 36 bytes in 1 blocks
==2268== suppressed: 0 bytes in 0 blocks
==2268== Rerun with --leak-check=full to see details of leaked memory
==2268==
==2268== For lists of detected and suppressed errors, rerun with: -s
==2268== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
[1] 2268 segmentation fault valgrind ./vole 0
vscode ➜ /workspaces/cpp/vole/build $ valgrind ./vole 1
==2427== Memcheck, a memory error detector
==2427== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2427== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==2427== Command: ./vole 1
==2427==
==2427== Invalid read of size 8
==2427== at 0x437838: macoro::Frame<osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x44030E: macoro::Frame<osuCrypto::OtReceiver::receiveCorrelated(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x40BE15: resume (coro_frame.h:850)
==2427== by 0x40BE15: start (sync_wait.h:123)
==2427== by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2427== by 0x40A8EB: receiver() (src/main.cpp:99)
==2427== by 0x40ACF6: main (src/main.cpp:118)
==2427== Address 0x4d96f68 is 8 bytes before a block of size 40 alloc'd
==2427== at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2427== by 0x437035: allocate (new_allocator.h:115)
==2427== by 0x437035: allocate (allocator.h:173)
==2427== by 0x437035: allocate (alloc_traits.h:460)
==2427== by 0x437035: _M_allocate (stl_vector.h:346)
==2427== by 0x437035: void std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> >::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters*, std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> > >) (vector.tcc:440)
==2427== by 0x438B93: osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}::operator()(macoro::FrameBase<macoro::detail::task_promise<void, true> >*) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x437AA1: osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x440256: macoro::Frame<osuCrypto::OtReceiver::receiveCorrelated(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x40BE15: resume (coro_frame.h:850)
==2427== by 0x40BE15: start (sync_wait.h:123)
==2427== by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2427== by 0x40A8EB: receiver() (src/main.cpp:99)
==2427== by 0x40ACF6: main (src/main.cpp:118)
==2427==
==2427== Invalid read of size 8
==2427== at 0x43783C: macoro::Frame<osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x44030E: macoro::Frame<osuCrypto::OtReceiver::receiveCorrelated(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x40BE15: resume (coro_frame.h:850)
==2427== by 0x40BE15: start (sync_wait.h:123)
==2427== by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2427== by 0x40A8EB: receiver() (src/main.cpp:99)
==2427== by 0x40ACF6: main (src/main.cpp:118)
==2427== Address 0x4d96f60 is 16 bytes before a block of size 40 alloc'd
==2427== at 0x4838DEF: operator new(unsigned long) (vg_replace_malloc.c:342)
==2427== by 0x437035: allocate (new_allocator.h:115)
==2427== by 0x437035: allocate (allocator.h:173)
==2427== by 0x437035: allocate (alloc_traits.h:460)
==2427== by 0x437035: _M_allocate (stl_vector.h:346)
==2427== by 0x437035: void std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> >::_M_realloc_insert<>(__gnu_cxx::__normal_iterator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters*, std::vector<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters, std::allocator<macoro::FrameBase<macoro::detail::task_promise<void, true> >::awaiters> > >) (vector.tcc:440)
==2427== by 0x438B93: osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}::operator()(macoro::FrameBase<macoro::detail::task_promise<void, true> >*) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x437AA1: osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x440256: macoro::Frame<osuCrypto::OtReceiver::receiveCorrelated(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x40BE15: resume (coro_frame.h:850)
==2427== by 0x40BE15: start (sync_wait.h:123)
==2427== by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2427== by 0x40A8EB: receiver() (src/main.cpp:99)
==2427== by 0x40ACF6: main (src/main.cpp:118)
==2427==
==2427== Jump to the invalid address stated on the next line
==2427== at 0x0: ???
==2427== by 0x43783F: macoro::Frame<osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x44030E: macoro::Frame<osuCrypto::OtReceiver::receiveCorrelated(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x40BE15: resume (coro_frame.h:850)
==2427== by 0x40BE15: start (sync_wait.h:123)
==2427== by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2427== by 0x40A8EB: receiver() (src/main.cpp:99)
==2427== by 0x40ACF6: main (src/main.cpp:118)
==2427== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==2427==
==2427==
==2427== Process terminating with default action of signal 11 (SIGSEGV)
==2427== Bad permissions for mapped region at address 0x0
==2427== at 0x0: ???
==2427== by 0x43783F: macoro::Frame<osuCrypto::IknpOtExtReceiver::receive(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::destroy_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x44030E: macoro::Frame<osuCrypto::OtReceiver::receiveCorrelated(osuCrypto::BitVector const&, nonstd::span_lite::span<osuCrypto::block, 18446744073709551615ul>, osuCrypto::PRNG&, coproto::Socket&)::{lambda(macoro::FrameBase<macoro::detail::task_promise<void, true> >*)#1}, macoro::detail::task_promise<void, true> >::resume_impl(macoro::FrameBase<void>*) (in /workspaces/cpp/vole/build/vole)
==2427== by 0x40BE15: resume (coro_frame.h:850)
==2427== by 0x40BE15: start (sync_wait.h:123)
==2427== by 0x40BE15: macoro::awaitable_traits<macoro::task<void, true>&&, void>::await_result macoro::sync_wait<macoro::task<void, true> >(macoro::task<void, true>&&) (sync_wait.h:186)
==2427== by 0x40A8EB: receiver() (src/main.cpp:99)
==2427== by 0x40ACF6: main (src/main.cpp:118)
==2427==
==2427== HEAP SUMMARY:
==2427== in use at exit: 63,770 bytes in 68 blocks
==2427== total heap usage: 110 allocs, 42 frees, 143,048 bytes allocated
==2427==
==2427== LEAK SUMMARY:
==2427== definitely lost: 0 bytes in 0 blocks
==2427== indirectly lost: 0 bytes in 0 blocks
==2427== possibly lost: 56,860 bytes in 15 blocks
==2427== still reachable: 6,910 bytes in 53 blocks
==2427== suppressed: 0 bytes in 0 blocks
==2427== Rerun with --leak-check=full to see details of leaked memory
==2427==
==2427== For lists of detected and suppressed errors, rerun with: -s
==2427== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
[1] 2427 segmentation fault valgrind ./vole 1
#include "coproto/Socket/AsioSocket.h"
#include "cryptoTools/Common/CLP.h"
#include "libOTe/Base/BaseOT.h"
#include "libOTe/TwoChooseOne/Iknp/IknpOtExtReceiver.h"
#include "libOTe/TwoChooseOne/Iknp/IknpOtExtSender.h"
#include "libOTe/TwoChooseOne/Kos/KosOtExtReceiver.h"
#include "libOTe/TwoChooseOne/Kos/KosOtExtSender.h"
using namespace osuCrypto;
using namespace std;
const u64 totalOTs = 1024;
const bool correlated = true; // !!! DOES NOT WORK WHEN TRUE !!!
const bool fake = true;
void sender() {
auto chl = cp::asioConnect("127.0.0.1:7700", true);
PRNG prng(sysRandomSeed());
IknpOtExtSender sender;
// KosOtExtSender sender;
cout << "OK" << endl;
if (fake) {
PRNG commonPRNG(oc::ZeroBlock);
std::array<std::array<block, 2>, 128> sendMsgs;
commonPRNG.get(sendMsgs.data(), sendMsgs.size());
BitVector bv(128);
bv.randomize(commonPRNG);
std::array<block, 128> recvMsgs;
for (u64 i = 0; i < 128; ++i) recvMsgs[i] = sendMsgs[i][bv[i]];
sender.setBaseOts(recvMsgs, bv);
} else {
DefaultBaseOT base;
BitVector bv(128);
std::array<block, 128> baseMsg;
bv.randomize(prng);
cout << "OK" << endl;
// perform the base To, call sync_wait to block until they have completed.
cp::sync_wait(base.receive(bv, baseMsg, prng, chl));
sender.setBaseOts(baseMsg, bv);
cout << "OK" << endl;
}
if (correlated) {
oc::AlignedUnVector<block> cMsgs(totalOTs);
prng.get(cMsgs.data(), cMsgs.size());
cout << "OK" << endl;
cp::sync_wait(sender.sendCorrelated(
cMsgs, [](block m0, u64 i) { return m0; }, prng, chl));
cout << "send" << cMsgs[0] << endl;
} else {
// construct a vector to stored the random send messages.
vector<array<block, 2>> sMsgs(totalOTs);
// Populate msgs with something useful...
prng.get(sMsgs.data(), sMsgs.size());
// perform the OTs. The receiver will learn one
// of the messages stored in msgs.
cp::sync_wait(sender.sendChosen(sMsgs, prng, chl));
cout << "send 0 " << sMsgs[0][0] << endl;
cout << "send 1 " << sMsgs[0][1] << endl;
}
}
void receiver() {
auto chl = cp::asioConnect("127.0.0.1:7700", false);
PRNG prng(sysRandomSeed());
IknpOtExtReceiver receiver;
// KosOtExtReceiver receiver;
if (fake) {
PRNG commonPRNG(oc::ZeroBlock);
std::array<std::array<block, 2>, 128> sendMsgs;
commonPRNG.get(sendMsgs.data(), sendMsgs.size());
receiver.setBaseOts(sendMsgs);
} else {
DefaultBaseOT base;
std::array<std::array<block, 2>, 128> baseMsg;
// perform the base To, call sync_wait to block until they have completed.
cp::sync_wait(base.send(baseMsg, prng, chl));
receiver.setBaseOts(baseMsg);
}
// construct the choices that we want.
BitVector choice(totalOTs);
// in this case pick random messages.
choice.randomize(prng);
// construct a vector to stored the received messages.
oc::AlignedUnVector<block> rMsgs(totalOTs);
if (correlated) {
cp::sync_wait(receiver.receiveCorrelated(choice, rMsgs, prng, chl));
} else {
// perform totalOTs chosen message OTs, the results will be written to
// msgs.
cp::sync_wait(receiver.receiveChosen(choice, rMsgs, prng, chl));
}
cout << "choice " << choice[0] << endl;
cout << rMsgs[0] << endl;
}
int main(int argc, char** argv) {
if (argc == 1) {
std::cout << "Usage: " << argv[0] << "0|1" << std::endl;
return 0;
}
if (argv[1][0] == '0') {
sender();
} else {
receiver();
}
}
from libote.
Thank you very much for your reply. I tried to copy and paste your code to libOTe/frontend/main.cpp
and complied using python3 build.py
, and it surprisingly worked! Then I tried my old code in that file and worked again. But both my old code and your code still got segmentation fault in my old project, so I am guessing I had some mistake in my CMake configuration.
I am new to CMake and tried to import libOTe by python build.py --all --boost --sodium
and then python build.py --install
, and here is my CMakeLists.txt
.
cmake_minimum_required(VERSION 3.18)
project(vole)
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20 -mssse3 -maes -pthread -Wall")
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -g")
file(GLOB SOURCES "src/*.cpp")
include_directories(${CMAKE_SOURCE_DIR})
add_executable(vole ${SOURCES})
find_package(libOTe REQUIRED)
target_link_libraries(vole oc::libOTe)
target_link_libraries(vole oc::libOTe_Tests oc::tests_cryptoTools)
target_compile_options(vole PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-std=c++${LIBOTE_STD_VER}>)
I guess this is not the best way to link libOTe since I installed it on OS level, I also tried the HINTS
method but it didn't work. What's the best practice to link libOTe? Thank you.
from libote.
ahh, ok bet it is that you're on cpp 20. This should work but I have not tested it well enough. macoro (my coroutine library) has support for cpp20 and my guess is that somehow when macoro see that you have cpp20 enables this support and then there is a bug in the interaction between legacy support and cpp20.
Switch to 17. If that works then I'll work on reproducing this and push a fix.
from libote.
No, I tried cpp 17 but still got segmentation fault.
from libote.
hmmm, maybe try
find_package(libOTe REQUIRED
PATHS /path/to/libOTe/repo
NO_DEFAULT_PATH
NO_CMAKE_ENVIRONMENT PATH
NO_CMAKE_PATH
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH
NO_CMAKE_FIND_ROOT_PATH)
where path/to/libOTe/repo
is replace with whatever it is. Then delete your build and try again.
from libote.
Still got segmentation fault. I am trying to build from scratch in another environment, but got this weird error when I tried to build libOTe...
file included from /home/halulu/bimsa-gshade/libOTe/out/macoro/tests/channel_spsc_tests.cpp:3:
In file included from /home/halulu/bimsa-gshade/libOTe/out/macoro/macoro/../macoro/channel_spsc.h:2:
/home/halulu/bimsa-gshade/libOTe/out/macoro/macoro/../macoro/channel.h:47:56: error: no member named 'exchange' in namespace 'std'; did you mean '__exchange'?
wrapper_base(wrapper_base&& o) : mChl(std::exchange(o.mChl, nullptr)), mIndex(o.mIndex), mPop(o.mPop) {};
~~~~~^~~~~~~~
__exchange
/usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/move.h:157:5: note: '__exchange' declared here
__exchange(_Tp& __obj, _Up&& __new_val)
from libote.
Dang, yeah im really at a loss about what it could be. You could remove all of your compile arguments. libOTe will already include those for you...
For the compile issue, add #include <utility>
to the top of /home/halulu/bimsa-gshade/libOTe/out/macoro/macoro/../macoro/channel.h
. I'll work on pushing a fix for this as well.
from libote.
Here is my CMakeLists.txt
, I have to set it to cpp 17 otherwise it won't compile, and I still got segmentation fault. I am trying to compile this in the new environment.
cmake_minimum_required(VERSION 3.18)
project(vole)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
file(GLOB SOURCES "src/*.cpp")
add_executable(vole ${SOURCES})
find_package(libOTe REQUIRED
PATHS libOTe
NO_DEFAULT_PATH
NO_CMAKE_ENVIRONMENT_PATH
NO_CMAKE_PATH
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_SYSTEM_PATH
NO_CMAKE_FIND_ROOT_PATH)
target_link_libraries(vole oc::libOTe)
from libote.
Strange... It worked in my new environment without installing libOTe, I guess my previous environment might be contaminated by multiple install of libOTe. Thank you so much for your help.
Btw I got the std::exchange
when building cryptoTools for libOTe, I added #include <utility>
to cryptoTools/Common/Defines.h
, not sure if this needs to be fixed.
from libote.
Related Issues (20)
- is using a TCR hash with KOS safe? HOT 9
- libOTe does not build HOT 5
- Question about performance
- Difference between silent VOLE and silent OT. HOT 5
- Building only Errors HOT 1
- Add support for subfield VOLE HOT 10
- SoftSpoken Test question HOT 2
- Question about slient VOLE HOT 12
- optimizations about silent ot HOT 2
- Fork of fork issue? HOT 1
- SoftSpokenOT doesn't work when using non-power-of-two as the fieldBits parameter HOT 2
- frontend examples does not correctly flush sockets HOT 1
- How to fix Segmantation fault HOT 27
- The network Problem HOT 4
- Can this code generate Random OTs using actively secure IKNP protocol? HOT 1
- libOTe does not build HOT 3
- Questions about codes in silent VOLE HOT 2
- Reverse the direction of the noisy_vole protocols (performance improvement)
- Build Failure: Compilation Error in RegularPprf.h HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from libote.