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

Reply via email to