diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2023-01-23 15:04:38 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-01-23 17:15:26 +0000 |
commit | f334da2d33a4a3dfeb017e002845a16dce87243f (patch) | |
tree | 99b50d2ed14164febb8ce4ba242aa150e9ffe677 | |
parent | 43c3ca4786c1ca14ec0225003908cde73a6ab638 (diff) |
Fix memory leak and random crash in windows playback backend
The leak is trivial, just not deleted object.
The crash is not trivial for reproducing; the fix is based on
the assumption that some events can be enqueued for an object
between deleteLater and real deleting.
Task-number: QTBUG-109149
Change-Id: I256f29a03e7f01d27923b183b63d9a6b6a4f21b9
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
(cherry picked from commit de266fd951d56dd937d63e79c6adf1702fbe0ec9)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/plugins/multimedia/windows/player/mfplayersession.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/plugins/multimedia/windows/player/mfplayersession.cpp b/src/plugins/multimedia/windows/player/mfplayersession.cpp index 3a8b3eb1a..7e2c6f9ec 100644 --- a/src/plugins/multimedia/windows/player/mfplayersession.cpp +++ b/src/plugins/multimedia/windows/player/mfplayersession.cpp @@ -76,7 +76,7 @@ MFPlayerSession::MFPlayerSession(MFPlayerControl *playerControl) m_request.rate = 1.0f; m_audioSampleGrabber = new AudioSampleGrabberCallback; - m_videoRendererControl = new MFVideoRendererControl; + m_videoRendererControl = new MFVideoRendererControl(this); } void MFPlayerSession::timeout() @@ -1514,8 +1514,13 @@ ULONG MFPlayerSession::AddRef(void) ULONG MFPlayerSession::Release(void) { LONG cRef = InterlockedDecrement(&m_cRef); - if (cRef == 0) - this->deleteLater(); + if (cRef == 0) { + deleteLater(); + + // In rare cases the session has queued events to be run between deleteLater and deleting, + // so we set the parent control to nullptr in order to prevent crashes in the cases. + m_playerControl = nullptr; + } return cRef; } |