Title: [278309] trunk/Source/WebCore
- Revision
- 278309
- Author
- [email protected]
- Date
- 2021-06-01 08:34:54 -0700 (Tue, 01 Jun 2021)
Log Message
Fix thread safety issues in MediaStreamAudioSourceNode
https://bugs.webkit.org/show_bug.cgi?id=226476
Reviewed by Youenn Fablet.
Adopt thread safety analysis annotations in MediaStreamAudioSourceNode and fix
bugs found by clang. In particular, the following issues were fixed:
- setFormat() could modify m_sourceNumberOfChannels before locking on the main
thread.
- process() was accessing m_sourceNumberOfChannels / m_sourceSampleRate
on the rendering thread *before* locking.
* Modules/webaudio/MediaStreamAudioSourceNode.cpp:
(WebCore::MediaStreamAudioSourceNode::setFormat):
(WebCore::MediaStreamAudioSourceNode::process):
* Modules/webaudio/MediaStreamAudioSourceNode.h:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (278308 => 278309)
--- trunk/Source/WebCore/ChangeLog 2021-06-01 15:19:38 UTC (rev 278308)
+++ trunk/Source/WebCore/ChangeLog 2021-06-01 15:34:54 UTC (rev 278309)
@@ -1,5 +1,24 @@
2021-06-01 Chris Dumez <[email protected]>
+ Fix thread safety issues in MediaStreamAudioSourceNode
+ https://bugs.webkit.org/show_bug.cgi?id=226476
+
+ Reviewed by Youenn Fablet.
+
+ Adopt thread safety analysis annotations in MediaStreamAudioSourceNode and fix
+ bugs found by clang. In particular, the following issues were fixed:
+ - setFormat() could modify m_sourceNumberOfChannels before locking on the main
+ thread.
+ - process() was accessing m_sourceNumberOfChannels / m_sourceSampleRate
+ on the rendering thread *before* locking.
+
+ * Modules/webaudio/MediaStreamAudioSourceNode.cpp:
+ (WebCore::MediaStreamAudioSourceNode::setFormat):
+ (WebCore::MediaStreamAudioSourceNode::process):
+ * Modules/webaudio/MediaStreamAudioSourceNode.h:
+
+2021-06-01 Chris Dumez <[email protected]>
+
Fix thread safety issues in WaveShaperProcessor
https://bugs.webkit.org/show_bug.cgi?id=226478
Modified: trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.cpp (278308 => 278309)
--- trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.cpp 2021-06-01 15:19:38 UTC (rev 278308)
+++ trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.cpp 2021-06-01 15:34:54 UTC (rev 278309)
@@ -89,7 +89,9 @@
void MediaStreamAudioSourceNode::setFormat(size_t numberOfChannels, float sourceSampleRate)
{
- float sampleRate = this->sampleRate();
+ // Synchronize with process().
+ Locker locker { m_processLock };
+
if (numberOfChannels == m_sourceNumberOfChannels && sourceSampleRate == m_sourceSampleRate)
return;
@@ -101,12 +103,10 @@
return;
}
- // Synchronize with process().
- Locker locker { m_processLock };
-
m_sourceNumberOfChannels = numberOfChannels;
m_sourceSampleRate = sourceSampleRate;
+ float sampleRate = this->sampleRate();
if (sourceSampleRate == sampleRate)
m_multiChannelResampler = nullptr;
else {
@@ -134,11 +134,6 @@
{
AudioBus* outputBus = output(0)->bus();
- if (!mediaStream() || !m_sourceNumberOfChannels || !m_sourceSampleRate) {
- outputBus->zero();
- return;
- }
-
// Use tryLock() to avoid contention in the real-time audio thread.
// If we fail to acquire the lock then the MediaStream must be in the middle of
// a format change, so we output silence in this case.
@@ -148,7 +143,8 @@
return;
}
Locker locker { AdoptLock, m_processLock };
- if (m_sourceNumberOfChannels != outputBus->numberOfChannels()) {
+
+ if (!m_sourceNumberOfChannels || !m_sourceSampleRate || m_sourceNumberOfChannels != outputBus->numberOfChannels()) {
outputBus->zero();
return;
}
Modified: trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.h (278308 => 278309)
--- trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.h 2021-06-01 15:19:38 UTC (rev 278308)
+++ trunk/Source/WebCore/Modules/webaudio/MediaStreamAudioSourceNode.h 2021-06-01 15:34:54 UTC (rev 278309)
@@ -46,7 +46,7 @@
~MediaStreamAudioSourceNode();
- MediaStream* mediaStream() { return &m_mediaStream.get(); }
+ MediaStream& mediaStream() { return m_mediaStream; }
private:
MediaStreamAudioSourceNode(BaseAudioContext&, MediaStream&, Ref<WebAudioSourceProvider>&&);
@@ -67,12 +67,12 @@
Ref<MediaStream> m_mediaStream;
Ref<WebAudioSourceProvider> m_provider;
- std::unique_ptr<MultiChannelResampler> m_multiChannelResampler;
+ std::unique_ptr<MultiChannelResampler> m_multiChannelResampler WTF_GUARDED_BY_LOCK(m_processLock);
Lock m_processLock;
- unsigned m_sourceNumberOfChannels { 0 };
- double m_sourceSampleRate { 0 };
+ unsigned m_sourceNumberOfChannels WTF_GUARDED_BY_LOCK(m_processLock) { 0 };
+ double m_sourceSampleRate WTF_GUARDED_BY_LOCK(m_processLock) { 0 };
};
} // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes