[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