[webkit-changes] [WebKit/WebKit] eece78: Constructing shared CARingBuffer cannot fail

Kimmo Kinnunen noreply at github.com
Thu Nov 3 08:23:39 PDT 2022


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: eece78fdf9b27b52c5bbfca25a207495098ce8c7
      https://github.com/WebKit/WebKit/commit/eece78fdf9b27b52c5bbfca25a207495098ce8c7
  Author: Kimmo Kinnunen <kkinnunen at apple.com>
  Date:   2022-11-03 (Thu, 03 Nov 2022)

  Changed paths:
    M Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.h
    M Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.mm
    M Source/WebCore/platform/audio/cocoa/CARingBuffer.cpp
    M Source/WebCore/platform/audio/cocoa/CARingBuffer.h
    M Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm
    M Source/WebKit/GPUProcess/media/RemoteAudioDestinationManager.cpp
    M Source/WebKit/GPUProcess/media/RemoteAudioDestinationManager.h
    M Source/WebKit/GPUProcess/media/RemoteAudioDestinationManager.messages.in
    M Source/WebKit/GPUProcess/media/RemoteAudioSourceProviderProxy.cpp
    M Source/WebKit/GPUProcess/media/RemoteAudioSourceProviderProxy.h
    M Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h
    M Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererInternalUnitManager.cpp
    M Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererInternalUnitManager.h
    M Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererInternalUnitManager.messages.in
    M Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.cpp
    M Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.h
    M Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.messages.in
    M Source/WebKit/Scripts/webkit/messages.py
    A Source/WebKit/Shared/Cocoa/SharedCARingBuffer.cpp
    A Source/WebKit/Shared/Cocoa/SharedCARingBuffer.h
    R Source/WebKit/Shared/Cocoa/SharedRingBufferStorage.cpp
    R Source/WebKit/Shared/Cocoa/SharedRingBufferStorage.h
    M Source/WebKit/SourcesCocoa.txt
    M Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp
    M Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSource.cpp
    M Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSource.h
    M Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSourceManager.cpp
    M Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSourceManager.h
    M Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSourceManager.messages.in
    M Source/WebKit/WebKit.xcodeproj/project.pbxproj
    M Source/WebKit/WebProcess/GPU/media/RemoteAudioDestinationProxy.cpp
    M Source/WebKit/WebProcess/GPU/media/RemoteAudioDestinationProxy.h
    M Source/WebKit/WebProcess/GPU/media/RemoteAudioSourceProviderManager.cpp
    M Source/WebKit/WebProcess/GPU/media/RemoteAudioSourceProviderManager.h
    M Source/WebKit/WebProcess/GPU/media/RemoteAudioSourceProviderManager.messages.in
    M Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.cpp
    M Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.messages.in
    M Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp
    M Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.h
    M Source/WebKit/WebProcess/Speech/SpeechRecognitionRealtimeMediaSourceManager.cpp
    M Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp
    M Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h
    M Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.messages.in
    M Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.cpp
    M Tools/TestWebKitAPI/Tests/WebCore/CARingBuffer.cpp

  Log Message:
  -----------
  Constructing shared CARingBuffer cannot fail
https://bugs.webkit.org/show_bug.cgi?id=247360
rdar://problem/101856691

Reviewed by Eric Carlson.

This is a problem because shared CARingBuffers are used cross-process,
and the WP might send data that would construct a potentially invalid
CARingBuffer. This leads to code that uses empty instances instead of
not checking all use-sites correctly. This in turn leads to running
code that is expected to only run when the ring buffer is correct.

Instead, make ConsumerCARingBuffer construction failable and hold
the instance accordingly. This is similar to many other related,
regular WebKit concepts like SharedMemory. Check all the construction
sites and use sites to not start audio processing unless the ring buffer is
present. This makes it easier in future to add more IPC validation
to the call sites that pass the ring buffer around and ensure that
the other parts of the code are consistent.

Previously, CARingBuffer was non-polymorphic class and its storage
class CARingBufferStorage was the polymorphic base class.
The usage was:
 CARingBuffer with CARingBufferStorageVector for in process ring buffer
 CARingBuffer with ReadOnlyRingBufferStorage for GPUP side consumer
 CARingBuffer with SharedRingBufferStorage for WP side producer

The two-class split does not make sense, as there are only one
non-polymorphic class and the arity is 1:1 in all cases.

Instead, rename:
 CARingBuffer is polymorphic base class
 InProcessCARingBuffer is the in-process ring buffer
 ProducerSharedCARingBuffer is the WP producer
 ConsumerSharedCARingBuffer is the read only GPUP side consumer

Moves the WebKit only code, CARingBuffer::adoptStorage() to
ConsumerSharedCARingBuffer::map().

Make sure Consumer is not superclass of Producer, as they're not
substitutable.

Use type alias ConsumerSharedCARingBuffer::Handle to communicate
the ring buffer to the receiver. This is so that it is obvious
what is being transferred as well as future-proofing the case
in which transferring ConsumerSharedCARingBuffer would need
more than the SHM handle. Use rvalue references to pass
the handle.

* Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.h:
* Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.mm:
(WebCore::AudioSampleDataSource::AudioSampleDataSource):
(WebCore::AudioSampleDataSource::setOutputFormat):
(WebCore::AudioSampleDataSource::pushSamplesInternal):
(WebCore::AudioSampleDataSource::pullSamples):
(WebCore::AudioSampleDataSource::pullSamplesInternal):
(WebCore::AudioSampleDataSource::pullAvailableSampleChunk):
(WebCore::AudioSampleDataSource::pullAvailableSamplesAsChunks):
* Source/WebCore/platform/audio/cocoa/CARingBuffer.cpp:
(WebCore::CARingBuffer::computeCapacityBytes):
(WebCore::CARingBuffer::computeSizeForBuffers):
(WebCore::CARingBuffer::initializeAfterAllocation):
(WebCore::CARingBuffer::allocate):
(WebCore::CARingBuffer::deallocate):
(WebCore::InProcessCARingBuffer::InProcessCARingBuffer):
(WebCore::InProcessCARingBuffer::flush):
(WebCore::InProcessCARingBuffer::allocateBuffers):
(WebCore::InProcessCARingBuffer::setCurrentFrameBounds):
(WebCore::InProcessCARingBuffer::getCurrentFrameBoundsWithoutUpdate):
(WebCore::InProcessCARingBuffer::currentStartFrame const):
(WebCore::InProcessCARingBuffer::currentEndFrame const):
(WebCore::CARingBufferStorageVector::CARingBufferStorageVector): Deleted.
(WebCore::CARingBuffer::CARingBuffer): Deleted.
(WebCore::CARingBuffer::~CARingBuffer): Deleted.
(WebCore::computeCapacityBytes): Deleted.
(WebCore::computeSizeForBuffers): Deleted.
(WebCore::CARingBuffer::adoptStorage): Deleted.
(WebCore::CARingBuffer::flush): Deleted.
(WebCore::CARingBufferStorageVector::allocate): Deleted.
(WebCore::CARingBufferStorageVector::flush): Deleted.
(WebCore::CARingBuffer::setCurrentFrameBounds): Deleted.
(WebCore::CARingBufferStorageVector::setCurrentFrameBounds): Deleted.
(WebCore::CARingBuffer::getCurrentFrameBoundsWithoutUpdate): Deleted.
(WebCore::CARingBufferStorageVector::getCurrentFrameBounds): Deleted.
(WebCore::CARingBuffer::currentStartFrame const): Deleted.
(WebCore::CARingBufferStorageVector::currentStartFrame const): Deleted.
(WebCore::CARingBuffer::currentEndFrame const): Deleted.
(WebCore::CARingBufferStorageVector::currentEndFrame const): Deleted.
(WebCore::CARingBuffer::updateFrameBounds): Deleted.
* Source/WebCore/platform/audio/cocoa/CARingBuffer.h:
(WebCore::CARingBuffer::updateFrameBounds):
(WebCore::CARingBuffer::frameOffset const):
(WebCore::CARingBufferStorage::updateFrameBounds): Deleted.
(WebCore::CARingBuffer::storage): Deleted.
* Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm:
(WebCore::AudioSourceProviderAVFObjC::AudioSourceProviderAVFObjC):
* Source/WebKit/GPUProcess/media/RemoteAudioDestinationManager.cpp:
(WebKit::RemoteAudioDestinationManager::audioSamplesStorageChanged):
* Source/WebKit/GPUProcess/media/RemoteAudioDestinationManager.h:
* Source/WebKit/GPUProcess/media/RemoteAudioDestinationManager.messages.in:
* Source/WebKit/GPUProcess/media/RemoteAudioSourceProviderProxy.cpp:
(WebKit::RemoteAudioSourceProviderProxy::createRingBuffer):
* Source/WebKit/GPUProcess/media/RemoteAudioSourceProviderProxy.h:
* Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h:
* Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererInternalUnitManager.cpp:
(WebKit::RemoteAudioMediaStreamTrackRendererInternalUnitManager::startUnit):
(WebKit::RemoteAudioMediaStreamTrackRendererInternalUnitManager::Unit::start):
* Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererInternalUnitManager.h:
* Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererInternalUnitManager.messages.in:
* Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.cpp:
(WebKit::RemoteMediaRecorder::RemoteMediaRecorder):
(WebKit::RemoteMediaRecorder::audioSamplesStorageChanged):
* Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.h:
* Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.messages.in:
* Source/WebKit/Scripts/webkit/messages.py:
(headers_for_type):
* Source/WebKit/Shared/Cocoa/SharedCARingBuffer.cpp: Renamed from Source/WebKit/Shared/Cocoa/SharedRingBufferStorage.cpp.
(WebKit::SharedCARingBufferBase::data):
(WebKit::SharedCARingBufferBase::sharedFrameBounds const):
(WebKit::SharedCARingBufferBase::getCurrentFrameBoundsWithoutUpdate):
(WebKit::SharedCARingBufferBase::flush):
(WebKit::SharedCARingBufferBase::updateFrameBounds):
(WebKit::SharedCARingBufferBase::size const):
(WebKit::ConsumerSharedCARingBuffer::ConsumerSharedCARingBuffer):
(WebKit::ConsumerSharedCARingBuffer::map):
(WebKit::ConsumerSharedCARingBuffer::allocateBuffers):
(WebKit::ProducerSharedCARingBuffer::setStorage):
(WebKit::ProducerSharedCARingBuffer::allocateBuffers):
(WebKit::ProducerSharedCARingBuffer::deallocateBuffers):
(WebKit::ProducerSharedCARingBuffer::setCurrentFrameBounds):
* Source/WebKit/Shared/Cocoa/SharedCARingBuffer.h: Renamed from Source/WebKit/Shared/Cocoa/SharedRingBufferStorage.h.
* Source/WebKit/SourcesCocoa.txt:
* Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
(WebKit::UserMediaCaptureManagerProxy::SourceProxy::~SourceProxy):
* Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSource.cpp:
(WebKit::m_manager):
(WebKit::SpeechRecognitionRemoteRealtimeMediaSource::setStorage):
(WebKit::m_ringBuffer): Deleted.
* Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSource.h:
* Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSourceManager.cpp:
(WebKit::SpeechRecognitionRemoteRealtimeMediaSourceManager::setStorage):
* Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSourceManager.h:
* Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSourceManager.messages.in:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/GPU/media/RemoteAudioDestinationProxy.cpp:
(WebKit::RemoteAudioDestinationProxy::RemoteAudioDestinationProxy):
* Source/WebKit/WebProcess/GPU/media/RemoteAudioDestinationProxy.h:
* Source/WebKit/WebProcess/GPU/media/RemoteAudioSourceProviderManager.cpp:
(WebKit::RemoteAudioSourceProviderManager::audioStorageChanged):
(WebKit::RemoteAudioSourceProviderManager::RemoteAudio::RemoteAudio):
(WebKit::RemoteAudioSourceProviderManager::RemoteAudio::setStorage):
* Source/WebKit/WebProcess/GPU/media/RemoteAudioSourceProviderManager.h:
* Source/WebKit/WebProcess/GPU/media/RemoteAudioSourceProviderManager.messages.in:
* Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.cpp:
(WebKit::AudioMediaStreamTrackRendererInternalUnitManager::Proxy::start):
* Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.messages.in:
* Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp:
(WebKit::MediaRecorderPrivate::startRecording):
* Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.h:
* Source/WebKit/WebProcess/Speech/SpeechRecognitionRealtimeMediaSourceManager.cpp:
(WebKit::SpeechRecognitionRealtimeMediaSourceManager::Source::Source):
(WebKit::SpeechRecognitionRealtimeMediaSourceManager::Source::~Source):
(WebKit::SpeechRecognitionRealtimeMediaSourceManager::Source::storage): Deleted.
* Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp:
(WebKit::RemoteCaptureSampleManager::audioStorageChanged):
(WebKit::RemoteCaptureSampleManager::RemoteAudio::setStorage):
* Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h:
* Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.messages.in:
* Source/WebKit/WebProcess/cocoa/RemoteRealtimeMediaSourceProxy.cpp:
* Tools/TestWebKitAPI/Tests/WebCore/CARingBuffer.cpp:
(TestWebKitAPI::CARingBufferTest::SetUp):

Canonical link: https://commits.webkit.org/256273@main




More information about the webkit-changes mailing list