From 21f6f56959fc20bfa1909d58412f90ba785c0ae9 Mon Sep 17 00:00:00 2001 From: Zach Toogood Date: Thu, 17 Apr 2025 10:25:29 +0100 Subject: [PATCH] Search: Ensure handler session lives long enough to see checkDeadline() --- src/search/search_handler.cpp | 7 ++++--- src/search/search_handler.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/search/search_handler.cpp b/src/search/search_handler.cpp index 0a8b027993c..92b6f826b65 100644 --- a/src/search/search_handler.cpp +++ b/src/search/search_handler.cpp @@ -74,7 +74,7 @@ void search_handler::start() if (socket_.lowest_layer().is_open()) { deadline_.expires_after(std::chrono::milliseconds(10000)); // AH searches can take quite a while - deadline_.async_wait(std::bind(&search_handler::checkDeadline, this)); + deadline_.async_wait(std::bind(&search_handler::checkDeadline, this, shared_from_this())); do_read(); } @@ -242,14 +242,15 @@ void search_handler::read_func(uint16_t length) return; } - deadline_.cancel(); // If we read, don't abort the deadline in the future if (length != ref(data_, 0x00) || length < 28) { ShowErrorFmt("Search packetsize wrong. Size {} should be {}.", length, ref(data_, 0x00)); return; } + deadline_.cancel(); // If we read, don't abort the deadline in the future decrypt(length); + if (validatePacket(length)) { uint8 packetType = data_[0x0B]; @@ -901,7 +902,7 @@ void search_handler::addToUsedIPAddresses(std::string const& ipAddressStr) // clang-format on } -void search_handler::checkDeadline() +void search_handler::checkDeadline(std::shared_ptr self) // self to keep the object alive { if (std::chrono::steady_clock::now() > deadline_.expiry()) { diff --git a/src/search/search_handler.h b/src/search/search_handler.h index a054f0c784a..091ec5984b5 100644 --- a/src/search/search_handler.h +++ b/src/search/search_handler.h @@ -91,7 +91,7 @@ class search_handler // Deadline timer to drop a read asio::steady_timer deadline_; - void checkDeadline(); + void checkDeadline(std::shared_ptr self); uint16_t getNumSessionsInUse(std::string const& ipAddressStr); void addToUsedIPAddresses(std::string const& ipAddressStr);