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); } };