diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index f010e9c600..8546a67d1c 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -433,6 +433,16 @@ void Session::clear() { _shortcutMessages = nullptr; _session->scheduledMessages().clear(); _session->sponsoredMessages().clear(); + + // Items are gone now, so HistoryMessageReply::resolvedStory raw + // pointers no longer linger. Tear stories down here so their + // shared_ptr drops while Main::Session::_data still + // holds a live pointer to us; otherwise the GroupCall destructor + // would run inside ~Data::Session and find data() returning a + // null reference (the parent unique_ptr resets its stored pointer + // before invoking the deleter). + _stories->clear(); + _dependentMessages.clear(); base::take(_messages); base::take(_nonChannelMessages); diff --git a/Telegram/SourceFiles/data/data_stories.cpp b/Telegram/SourceFiles/data/data_stories.cpp index 67442345fc..232f352f92 100644 --- a/Telegram/SourceFiles/data/data_stories.cpp +++ b/Telegram/SourceFiles/data/data_stories.cpp @@ -222,6 +222,13 @@ Stories::~Stories() { Expects(_pollingViews.empty()); } +void Stories::clear() { + _pollingSettings.clear(); + _pollingViews.clear(); + _stories.clear(); + _deletingStories.clear(); +} + Session &Stories::owner() const { return *_owner; } diff --git a/Telegram/SourceFiles/data/data_stories.h b/Telegram/SourceFiles/data/data_stories.h index e6648fa02f..b944a76da2 100644 --- a/Telegram/SourceFiles/data/data_stories.h +++ b/Telegram/SourceFiles/data/data_stories.h @@ -158,6 +158,8 @@ public: static constexpr auto kInProfileToastDuration = 4 * crl::time(1000); + void clear(); + [[nodiscard]] Session &owner() const; [[nodiscard]] Main::Session &session() const;