From 07231dd9e1baf8fd16698774361fe6c325ee90d9 Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Mon, 12 Sep 2022 19:11:25 -0300 Subject: [PATCH] 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. --- llarp/dns/server.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/llarp/dns/server.cpp b/llarp/dns/server.cpp index 27fb6e40e..2454ec0ac 100644 --- a/llarp/dns/server.cpp +++ b/llarp/dns/server.cpp @@ -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 pkt) { - m_OwnedPacketSources.push_back(pkt); AddPacketSource(std::weak_ptr{pkt}); + m_OwnedPacketSources.push_back(std::move(pkt)); } void