summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2023-01-23 15:04:38 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-01-23 17:15:26 +0000
commitf334da2d33a4a3dfeb017e002845a16dce87243f (patch)
tree99b50d2ed14164febb8ce4ba242aa150e9ffe677
parent43c3ca4786c1ca14ec0225003908cde73a6ab638 (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.cpp11
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;
}