Fixed crash in DNS resolving

The inner lambda here wasn't keeping the `Query` (`this`) alive, so
`src` wasn't valid anymore.  This changes it to copy the `src`
shared_ptr into the lambda instead of capturing `this`, and fixes it.
pull/1969/head
Jason Rhinelander 2 years ago
parent d4739d5d47
commit 07231dd9e1
No known key found for this signature in database
GPG Key ID: C4992CE7A88D4262

@ -100,7 +100,7 @@ namespace llarp::dns
SockAddr fromaddr)
: QueryJob_Base{std::move(query)}
, parent{parent_}
, src{pktsrc}
, src{std::move(pktsrc)}
, resolverAddr{std::move(toaddr)}
, askerAddr{std::move(fromaddr)}
{}
@ -411,22 +411,22 @@ namespace llarp::dns
}
}
// leak bare pointer and try to do the request
auto* pending = tmp.release();
const auto& q = query.questions[0];
if (auto err = ub_resolve_async(
m_ctx.get(),
q.Name().c_str(),
q.qtype,
q.qclass,
(void*)pending,
tmp.get(),
&Resolver::Callback,
nullptr))
{
// take back ownership on fail
log::warning(
logcat, "failed to send upstream query with libunbound: {}", ub_strerror(err));
tmp.reset(pending);
tmp->Cancel();
} else {
(void) tmp.release();
}
return true;
}
@ -437,7 +437,7 @@ namespace llarp::dns
{
if (auto ptr = parent.lock())
{
ptr->call([this, from = resolverAddr, to = askerAddr, buf = replyBuf.copy()] {
ptr->call([src = src, from = resolverAddr, to = askerAddr, buf = replyBuf.copy()] {
src->SendTo(to, from, OwnedBuffer::copy_from(buf));
});
}
@ -561,8 +561,8 @@ namespace llarp::dns
void
Server::AddPacketSource(std::shared_ptr<PacketSource_Base> pkt)
{
m_OwnedPacketSources.push_back(pkt);
AddPacketSource(std::weak_ptr<PacketSource_Base>{pkt});
m_OwnedPacketSources.push_back(std::move(pkt));
}
void

Loading…
Cancel
Save