From 82e890746bb09e715fcfbccfbf593588aea561f7 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 20 Dec 2024 21:06:17 +0400 Subject: [PATCH] Fix possible crash in global media search. --- .../info/global_media/info_global_media_provider.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/info/global_media/info_global_media_provider.cpp b/Telegram/SourceFiles/info/global_media/info_global_media_provider.cpp index 3353208c2..9f73f5859 100644 --- a/Telegram/SourceFiles/info/global_media/info_global_media_provider.cpp +++ b/Telegram/SourceFiles/info/global_media/info_global_media_provider.cpp @@ -240,7 +240,7 @@ rpl::producer Provider::source( auto lifetime = rpl::lifetime(); const auto session = &_controller->session(); - struct State { + struct State : base::has_weak_ptr { State(not_null session) : session(session) { } ~State() { @@ -252,11 +252,15 @@ rpl::producer Provider::source( mtpRequestId requestId = 0; }; const auto state = lifetime.make_state(session); + const auto guard = base::make_weak(state); state->pushAndLoadMore = [=] { auto result = fillRequest(aroundId, limitBefore, limitAfter); + + // May destroy 'state' by calling source() with different args. consumer.put_next(std::move(result.slice)); - if (!currentList()->loaded && result.notEnough) { + + if (guard && !currentList()->loaded && result.notEnough) { state->requestId = requestMore(state->pushAndLoadMore); } };