summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Srebrny <piotr.srebrny@qt.io>2021-11-03 14:45:58 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-11-09 16:14:20 +0000
commita991850c5aef363ff960b4ff7a7753a69741a732 (patch)
treed510e0eaa3efe988748f58241aa0b4dc6f23b47b
parentab0257485b50a9afe30055b1f7b9dbebaaba99a9 (diff)
downloadqtmultimedia-a991850c5aef363ff960b4ff7a7753a69741a732.tar.gz
Avoid implicit conversion to pointer from QWindowsIUPointer
When converting from QWindowsIUPointer<T> to T* we can accidentally leak pointer when doing assignment operation such as: var_a = var_b. If var_a is T* and var_b is QWindowsIUPointer<T>, the pointer is set on var_a without any warning but the reference counting is incorrect. Change-Id: I8e770185856f5c1d84dac610fe7f95631dcf4308 Reviewed-by: André de la Rocha <andre.rocha@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io> (cherry picked from commit 0a86e3e2778dfe7860aa4712ff94069e78648586) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/multimedia/platform/windows/common/qwindowsiupointer_p.h12
-rw-r--r--src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp20
-rw-r--r--src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp4
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp2
-rw-r--r--src/multimedia/platform/windows/qwindowsmediadevices.cpp4
5 files changed, 21 insertions, 21 deletions
diff --git a/src/multimedia/platform/windows/common/qwindowsiupointer_p.h b/src/multimedia/platform/windows/common/qwindowsiupointer_p.h
index b04d51142..9e9cf6894 100644
--- a/src/multimedia/platform/windows/common/qwindowsiupointer_p.h
+++ b/src/multimedia/platform/windows/common/qwindowsiupointer_p.h
@@ -79,15 +79,15 @@ public:
}
explicit operator bool() const { return m_ptr != nullptr; }
- operator T*() const { return m_ptr; }
- T* operator->() const { return m_ptr; }
+ T *operator->() const { return m_ptr; }
- T** address() { Q_ASSERT(m_ptr == nullptr); return &m_ptr; }
- void reset(T* ptr = nullptr) { if (m_ptr) m_ptr->Release(); m_ptr = ptr; }
- T* release() { T* ptr = m_ptr; m_ptr = nullptr; return ptr; }
+ T **address() { Q_ASSERT(m_ptr == nullptr); return &m_ptr; }
+ void reset(T *ptr = nullptr) { if (m_ptr) m_ptr->Release(); m_ptr = ptr; }
+ T *release() { T *ptr = m_ptr; m_ptr = nullptr; return ptr; }
+ T *get() const { return m_ptr; }
private:
- T* m_ptr;
+ T *m_ptr;
};
#endif
diff --git a/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp b/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp
index e850a43d2..263a7e6d9 100644
--- a/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp
+++ b/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp
@@ -181,7 +181,7 @@ HRESULT MFAudioDecoderControl::setResamplerOutputType(IMFMediaType *outputType)
m_convertSample.reset();
return hr;
}
- m_convertSample->AddBuffer(buffer);
+ m_convertSample->AddBuffer(buffer.get());
}
return S_OK;
}
@@ -220,7 +220,7 @@ void MFAudioDecoderControl::startReadingSource(IMFMediaSource *source)
}
auto mediaType = m_decoderSourceReader->setSource(source, m_outputFormat.sampleFormat());
- m_mediaFormat = mediaTypeToFormat(mediaType);
+ m_mediaFormat = mediaTypeToFormat(mediaType.get());
if (!m_mediaFormat.isValid()) {
error(QAudioDecoder::FormatError, tr("Invalid media format"));
m_decoderSourceReader.reset();
@@ -237,10 +237,10 @@ void MFAudioDecoderControl::startReadingSource(IMFMediaSource *source)
}
if (useResampler()) {
- HRESULT hr = m_resampler->SetInputType(m_mfInputStreamID, mediaType, 0);
+ HRESULT hr = m_resampler->SetInputType(m_mfInputStreamID, mediaType.get(), 0);
if (SUCCEEDED(hr)) {
if (auto output = formatToMediaType(m_outputFormat); output) {
- hr = setResamplerOutputType(output);
+ hr = setResamplerOutputType(output.get());
if (FAILED(hr)) {
qWarning() << "MFAudioDecoderControl: failed to SetOutputType of resampler: "
<< std::system_category().message(hr).c_str();
@@ -254,8 +254,8 @@ void MFAudioDecoderControl::startReadingSource(IMFMediaSource *source)
}
}
- connect(m_decoderSourceReader, SIGNAL(finished()), this, SLOT(handleSourceFinished()));
- connect(m_decoderSourceReader, SIGNAL(newSample(QWindowsIUPointer<IMFSample>)), this, SLOT(handleNewSample(QWindowsIUPointer<IMFSample>)));
+ connect(m_decoderSourceReader.get(), SIGNAL(finished()), this, SLOT(handleSourceFinished()));
+ connect(m_decoderSourceReader.get(), SIGNAL(newSample(QWindowsIUPointer<IMFSample>)), this, SLOT(handleNewSample(QWindowsIUPointer<IMFSample>)));
setIsDecoding(true);
@@ -291,7 +291,7 @@ void MFAudioDecoderControl::stop()
if (!isDecoding())
return;
- disconnect(m_decoderSourceReader);
+ disconnect(m_decoderSourceReader.get());
m_decoderSourceReader->clearSource();
m_decoderSourceReader.reset();
@@ -340,7 +340,7 @@ void MFAudioDecoderControl::handleNewSample(QWindowsIUPointer<IMFSample> sample)
HRESULT hr = S_OK;
if (useResampler()) {
- hr = m_resampler->ProcessInput(m_mfInputStreamID, sample, 0);
+ hr = m_resampler->ProcessInput(m_mfInputStreamID, sample.get(), 0);
if (SUCCEEDED(hr)) {
bool getSampleStartTime = true;
MFT_OUTPUT_DATA_BUFFER outputDataBuffer;
@@ -348,7 +348,7 @@ void MFAudioDecoderControl::handleNewSample(QWindowsIUPointer<IMFSample> sample)
do {
outputDataBuffer.pEvents = nullptr;
outputDataBuffer.dwStatus = 0;
- outputDataBuffer.pSample = m_convertSample;
+ outputDataBuffer.pSample = m_convertSample.get();
DWORD status = 0;
hr = m_resampler->ProcessOutput(0, 1, &outputDataBuffer, &status);
if (SUCCEEDED(hr)) {
@@ -365,7 +365,7 @@ void MFAudioDecoderControl::handleNewSample(QWindowsIUPointer<IMFSample> sample)
}
} else {
sample->GetSampleTime(&sampleStartTime);
- hr = addDataFromIMFSample(abuf, sample);
+ hr = addDataFromIMFSample(abuf, sample.get());
}
if (FAILED(hr)) {
diff --git a/src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp b/src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp
index 3cf0b6df5..e0b54dcde 100644
--- a/src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp
+++ b/src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp
@@ -58,7 +58,7 @@ QWindowsIUPointer<IMFMediaType> MFDecoderSourceReader::setSource(IMFMediaSource
if (FAILED(attr->SetUINT32(MF_SOURCE_READER_DISCONNECT_MEDIASOURCE_ON_SHUTDOWN, TRUE)))
return mediaType;
- HRESULT hr = MFCreateSourceReaderFromMediaSource(source, attr, m_sourceReader.address());
+ HRESULT hr = MFCreateSourceReaderFromMediaSource(source, attr.get(), m_sourceReader.address());
if (FAILED(hr)) {
qWarning() << "MFDecoderSourceReader: failed to setup source reader: "
<< std::system_category().message(hr).c_str();
@@ -72,7 +72,7 @@ QWindowsIUPointer<IMFMediaType> MFDecoderSourceReader::setSource(IMFMediaSource
MFCreateMediaType(pPartialType.address());
pPartialType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
pPartialType->SetGUID(MF_MT_SUBTYPE, sampleFormat == QAudioFormat::Float ? MFAudioFormat_Float : MFAudioFormat_PCM);
- m_sourceReader->SetCurrentMediaType(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), nullptr, pPartialType);
+ m_sourceReader->SetCurrentMediaType(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), nullptr, pPartialType.get());
m_sourceReader->GetCurrentMediaType(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), mediaType.address());
// Ensure the stream is selected.
m_sourceReader->SetStreamSelection(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), TRUE);
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp
index 3cbe259af..16414cca5 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp
@@ -692,7 +692,7 @@ QMediaRecorder::Error QWindowsMediaDeviceReader::startRecording(
QWindowsIUPointer<IMFSinkWriter> sinkWriter;
hr = MFCreateSinkWriterFromURL(reinterpret_cast<LPCWSTR>(fileName.utf16()),
- nullptr, writerAttributes, sinkWriter.address());
+ nullptr, writerAttributes.get(), sinkWriter.address());
if (FAILED(hr))
return QMediaRecorder::LocationNotWritable;
diff --git a/src/multimedia/platform/windows/qwindowsmediadevices.cpp b/src/multimedia/platform/windows/qwindowsmediadevices.cpp
index a5255692a..80058ab5c 100644
--- a/src/multimedia/platform/windows/qwindowsmediadevices.cpp
+++ b/src/multimedia/platform/windows/qwindowsmediadevices.cpp
@@ -270,7 +270,7 @@ QWindowsMediaDevices::QWindowsMediaDevices()
m_notificationClient.reset(new CMMNotificationClient(this, m_deviceEnumerator, std::move(devState)));
- m_deviceEnumerator->RegisterEndpointNotificationCallback(m_notificationClient);
+ m_deviceEnumerator->RegisterEndpointNotificationCallback(m_notificationClient.get());
} else {
qWarning() << "Audio device change notification disabled";
@@ -303,7 +303,7 @@ QWindowsMediaDevices::QWindowsMediaDevices()
QWindowsMediaDevices::~QWindowsMediaDevices()
{
if (m_deviceEnumerator) {
- m_deviceEnumerator->UnregisterEndpointNotificationCallback(m_notificationClient);
+ m_deviceEnumerator->UnregisterEndpointNotificationCallback(m_notificationClient.get());
}
m_deviceEnumerator.reset();