summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2023-01-23 15:04:38 +0100
committerArtem Dyomin <artem.dyomin@qt.io>2023-01-23 15:40:39 +0000
commitde266fd951d56dd937d63e79c6adf1702fbe0ec9 (patch)
tree4e451d4f8b9b84f8c24821bded98b871ac2f28f2
parent8024029a57e73a10ab0792eb1d1605fa6bef7ef3 (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 Pick-to: 6.5 6.4 6.2 Change-Id: I256f29a03e7f01d27923b183b63d9a6b6a4f21b9 Reviewed-by: Lars Knoll <lars@knoll.priv.no>
-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 49b76e2a2..54df5ab90 100644
--- a/src/plugins/multimedia/windows/player/mfplayersession.cpp
+++ b/src/plugins/multimedia/windows/player/mfplayersession.cpp
@@ -77,7 +77,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()
@@ -1515,8 +1515,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;
}