haikuwebkit/Source/WTF/wtf/MachSendRight.h

69 lines
2.4 KiB
C
Raw Permalink Normal View History

/*
Failures from mach port reference handling should be fatal https://bugs.webkit.org/show_bug.cgi?id=184202 <rdar://problem/37771114> Reviewed by Anders Carlsson. Source/WebCore: We may corrupt the Mach port space by improperly matching the equivalent of reference counting retains (mach_port_mod_refs) with releases (mach_port_deallocate). Our current implementation of MachSendRights::create does not grab a reference if the passed port is MACH_PORT_DEAD, but we unconditionally call mach_port_deallocate on the port, which could lead to a reference count mismatch. Likewise, our MachSendRight destructor does not release the port if it has changed to MACH_PORT_DEAD (e.g., if a child process dies), again leading to a mismatch in retain/releases. Finally, failures in mach_port_deallocate should be fatal because they indicate that the application was attempting to remove an unowned right. This is a fatal condition for Mach, and should lead to an abort. This patch does the following: 1. It creates a helper function that does the right thing for safely deallocating a mach port. 2. It uses it in multiple places. 3. It revises 'MachSendRight::create" so that it properly handles the condition of a dead port. 4. It revises the MachSendRight destructor to properly handle the condition of a dead port. No new tests, no change in behavior expected. * SourcesCocoa.txt: Update for move of MachSendRight files. * WebCore.xcodeproj/project.pbxproj: Ditto. * page/cocoa/ResourceUsageThreadCocoa.mm: (WebCore::getMachThreads): Added. (WebCore::cpuUsage): Use the new cleanup helper function. * platform/cocoa/MachSendRight.cpp: Removed. * platform/cocoa/MachSendRight.h: Removed. * platform/graphics/avfoundation/objc/VideoFullscreenLayerManagerObjC.mm: (WebCore::VideoFullscreenLayerManagerObjC::setVideoFullscreenLayer): * platform/graphics/cocoa/IOSurface.h: * platform/graphics/cocoa/IOSurface.mm: Source/WebKit: Update for new location of MachSendRight.h. Switch to #pragma once in a few places. * Platform/IPC/mac/ConnectionMac.mm: (IPC::Connection::platformInvalidate): Adopt new 'safe mach_port_t deallocation' function. (IPC::Connection::initializeSendSource): Ditto. (IPC::Connection::receiveSourceEventHandler): Ditto. * Platform/SharedMemory.h: * Platform/cocoa/SharedMemoryCocoa.cpp: (WebKit::SharedMemory::Handle::clear): Ditto. (WebKit::makeMemoryEntry): Ditto. (WebKit::SharedMemory::createSendRight const): Ditto. * Platform/mac/LayerHostingContext.h: * Platform/mac/LayerHostingContext.mm: * PluginProcess/PluginControllerProxy.h: * PluginProcess/PluginProcess.h: (WebKit::PluginProcess::compositingRenderServerPort const): * Scripts/messages.py: (headers_for_type): Update for new location of MachSendRight. * Shared/Plugins/PluginProcessCreationParameters.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm: (WebKit::RemoteLayerBackingStore::encode const): * Shared/WebCoreArgumentCoders.h: * Shared/WebProcessCreationParameters.h: * Shared/mac/WebCoreArgumentCodersMac.mm: * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: * UIProcess/DrawingAreaProxy.cpp: * UIProcess/DrawingAreaProxy.h: * UIProcess/Launcher/mac/ProcessLauncherMac.mm: (WebKit::ProcessLauncher::launchProcess): Ditto. Remove uneeded mach_port_dealloc called after xpc_dictionary_set_mach_send. While '..._set_mach_send' retains the send right, it gets automatically released when the message is handled. We only want to manually deallocate the send right if the message failed to send. * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: * UIProcess/WebPageProxy.cpp: * UIProcess/WebPageProxy.h: * UIProcess/WebPageProxy.messages.in: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm: * UIProcess/mac/WKViewLayoutStrategy.mm: * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp: * WebProcess/Plugins/Netscape/NetscapePlugin.h: * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm: * WebProcess/Plugins/PluginController.h: * WebProcess/Plugins/PluginView.h: * WebProcess/WebPage/DrawingArea.h: (WebKit::DrawingArea::addFence): (WebKit::DrawingArea::updateGeometry): * WebProcess/WebPage/DrawingArea.messages.in: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::updateGeometry): * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::setTopContentInsetFenced): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::updateGeometry): * WebProcess/WebProcess.h: (WebKit::WebProcess::compositingRenderServerPort const): * WebProcess/cocoa/VideoFullscreenManager.mm: (WebKit::VideoFullscreenManager::setVideoLayerFrameFenced): Source/WebKitLegacy/mac: * Plugins/Hosted/NetscapePluginHostManager.mm: (WebKit::NetscapePluginHostManager::spawnPluginHost): Adopt new 'safe mach_port_t deallocation' function. Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/MachSendRight.h: Copied from WebCore/platform/cocoa/MachSendRight.h. (WebCore::MachSendRight::operator bool const): Deleted. (WebCore::MachSendRight::sendRight const): Deleted. * wtf/PlatformMac.cmake: * wtf/cocoa/CPUTimeCocoa.mm: (WTF::CPUTime::forCurrentThread): Do proper cleanup if the port is invalid. * wtf/cocoa/MachSendRight.cpp: Copied from WebCore/platform/cocoa/MachSendRight.cpp. (WTF::retainSendRight): (WTF::releaseSendRight): (WTF::deallocateSendRightSafely): (WebCore::retainSendRight): Deleted. (WebCore::releaseSendRight): Deleted. (WebCore::MachSendRight::adopt): Deleted. (WebCore::MachSendRight::create): Deleted. (WebCore::MachSendRight::MachSendRight): Deleted. (WebCore::MachSendRight::~MachSendRight): Deleted. (WebCore::MachSendRight::operator=): Deleted. (WebCore::MachSendRight::copySendRight const): Deleted. (WebCore::MachSendRight::leakSendRight): Deleted. Canonical link: https://commits.webkit.org/199860@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@230269 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-04-04 19:43:01 +00:00
* Copyright (C) 2014-2018 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
Failures from mach port reference handling should be fatal https://bugs.webkit.org/show_bug.cgi?id=184202 <rdar://problem/37771114> Reviewed by Anders Carlsson. Source/WebCore: We may corrupt the Mach port space by improperly matching the equivalent of reference counting retains (mach_port_mod_refs) with releases (mach_port_deallocate). Our current implementation of MachSendRights::create does not grab a reference if the passed port is MACH_PORT_DEAD, but we unconditionally call mach_port_deallocate on the port, which could lead to a reference count mismatch. Likewise, our MachSendRight destructor does not release the port if it has changed to MACH_PORT_DEAD (e.g., if a child process dies), again leading to a mismatch in retain/releases. Finally, failures in mach_port_deallocate should be fatal because they indicate that the application was attempting to remove an unowned right. This is a fatal condition for Mach, and should lead to an abort. This patch does the following: 1. It creates a helper function that does the right thing for safely deallocating a mach port. 2. It uses it in multiple places. 3. It revises 'MachSendRight::create" so that it properly handles the condition of a dead port. 4. It revises the MachSendRight destructor to properly handle the condition of a dead port. No new tests, no change in behavior expected. * SourcesCocoa.txt: Update for move of MachSendRight files. * WebCore.xcodeproj/project.pbxproj: Ditto. * page/cocoa/ResourceUsageThreadCocoa.mm: (WebCore::getMachThreads): Added. (WebCore::cpuUsage): Use the new cleanup helper function. * platform/cocoa/MachSendRight.cpp: Removed. * platform/cocoa/MachSendRight.h: Removed. * platform/graphics/avfoundation/objc/VideoFullscreenLayerManagerObjC.mm: (WebCore::VideoFullscreenLayerManagerObjC::setVideoFullscreenLayer): * platform/graphics/cocoa/IOSurface.h: * platform/graphics/cocoa/IOSurface.mm: Source/WebKit: Update for new location of MachSendRight.h. Switch to #pragma once in a few places. * Platform/IPC/mac/ConnectionMac.mm: (IPC::Connection::platformInvalidate): Adopt new 'safe mach_port_t deallocation' function. (IPC::Connection::initializeSendSource): Ditto. (IPC::Connection::receiveSourceEventHandler): Ditto. * Platform/SharedMemory.h: * Platform/cocoa/SharedMemoryCocoa.cpp: (WebKit::SharedMemory::Handle::clear): Ditto. (WebKit::makeMemoryEntry): Ditto. (WebKit::SharedMemory::createSendRight const): Ditto. * Platform/mac/LayerHostingContext.h: * Platform/mac/LayerHostingContext.mm: * PluginProcess/PluginControllerProxy.h: * PluginProcess/PluginProcess.h: (WebKit::PluginProcess::compositingRenderServerPort const): * Scripts/messages.py: (headers_for_type): Update for new location of MachSendRight. * Shared/Plugins/PluginProcessCreationParameters.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm: (WebKit::RemoteLayerBackingStore::encode const): * Shared/WebCoreArgumentCoders.h: * Shared/WebProcessCreationParameters.h: * Shared/mac/WebCoreArgumentCodersMac.mm: * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: * UIProcess/DrawingAreaProxy.cpp: * UIProcess/DrawingAreaProxy.h: * UIProcess/Launcher/mac/ProcessLauncherMac.mm: (WebKit::ProcessLauncher::launchProcess): Ditto. Remove uneeded mach_port_dealloc called after xpc_dictionary_set_mach_send. While '..._set_mach_send' retains the send right, it gets automatically released when the message is handled. We only want to manually deallocate the send right if the message failed to send. * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: * UIProcess/WebPageProxy.cpp: * UIProcess/WebPageProxy.h: * UIProcess/WebPageProxy.messages.in: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm: * UIProcess/mac/WKViewLayoutStrategy.mm: * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp: * WebProcess/Plugins/Netscape/NetscapePlugin.h: * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm: * WebProcess/Plugins/PluginController.h: * WebProcess/Plugins/PluginView.h: * WebProcess/WebPage/DrawingArea.h: (WebKit::DrawingArea::addFence): (WebKit::DrawingArea::updateGeometry): * WebProcess/WebPage/DrawingArea.messages.in: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::updateGeometry): * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::setTopContentInsetFenced): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::updateGeometry): * WebProcess/WebProcess.h: (WebKit::WebProcess::compositingRenderServerPort const): * WebProcess/cocoa/VideoFullscreenManager.mm: (WebKit::VideoFullscreenManager::setVideoLayerFrameFenced): Source/WebKitLegacy/mac: * Plugins/Hosted/NetscapePluginHostManager.mm: (WebKit::NetscapePluginHostManager::spawnPluginHost): Adopt new 'safe mach_port_t deallocation' function. Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/MachSendRight.h: Copied from WebCore/platform/cocoa/MachSendRight.h. (WebCore::MachSendRight::operator bool const): Deleted. (WebCore::MachSendRight::sendRight const): Deleted. * wtf/PlatformMac.cmake: * wtf/cocoa/CPUTimeCocoa.mm: (WTF::CPUTime::forCurrentThread): Do proper cleanup if the port is invalid. * wtf/cocoa/MachSendRight.cpp: Copied from WebCore/platform/cocoa/MachSendRight.cpp. (WTF::retainSendRight): (WTF::releaseSendRight): (WTF::deallocateSendRightSafely): (WebCore::retainSendRight): Deleted. (WebCore::releaseSendRight): Deleted. (WebCore::MachSendRight::adopt): Deleted. (WebCore::MachSendRight::create): Deleted. (WebCore::MachSendRight::MachSendRight): Deleted. (WebCore::MachSendRight::~MachSendRight): Deleted. (WebCore::MachSendRight::operator=): Deleted. (WebCore::MachSendRight::copySendRight const): Deleted. (WebCore::MachSendRight::leakSendRight): Deleted. Canonical link: https://commits.webkit.org/199860@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@230269 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-04-04 19:43:01 +00:00
#pragma once
#if PLATFORM(COCOA)
#include <mach/mach_port.h>
Failures from mach port reference handling should be fatal https://bugs.webkit.org/show_bug.cgi?id=184202 <rdar://problem/37771114> Reviewed by Anders Carlsson. Source/WebCore: We may corrupt the Mach port space by improperly matching the equivalent of reference counting retains (mach_port_mod_refs) with releases (mach_port_deallocate). Our current implementation of MachSendRights::create does not grab a reference if the passed port is MACH_PORT_DEAD, but we unconditionally call mach_port_deallocate on the port, which could lead to a reference count mismatch. Likewise, our MachSendRight destructor does not release the port if it has changed to MACH_PORT_DEAD (e.g., if a child process dies), again leading to a mismatch in retain/releases. Finally, failures in mach_port_deallocate should be fatal because they indicate that the application was attempting to remove an unowned right. This is a fatal condition for Mach, and should lead to an abort. This patch does the following: 1. It creates a helper function that does the right thing for safely deallocating a mach port. 2. It uses it in multiple places. 3. It revises 'MachSendRight::create" so that it properly handles the condition of a dead port. 4. It revises the MachSendRight destructor to properly handle the condition of a dead port. No new tests, no change in behavior expected. * SourcesCocoa.txt: Update for move of MachSendRight files. * WebCore.xcodeproj/project.pbxproj: Ditto. * page/cocoa/ResourceUsageThreadCocoa.mm: (WebCore::getMachThreads): Added. (WebCore::cpuUsage): Use the new cleanup helper function. * platform/cocoa/MachSendRight.cpp: Removed. * platform/cocoa/MachSendRight.h: Removed. * platform/graphics/avfoundation/objc/VideoFullscreenLayerManagerObjC.mm: (WebCore::VideoFullscreenLayerManagerObjC::setVideoFullscreenLayer): * platform/graphics/cocoa/IOSurface.h: * platform/graphics/cocoa/IOSurface.mm: Source/WebKit: Update for new location of MachSendRight.h. Switch to #pragma once in a few places. * Platform/IPC/mac/ConnectionMac.mm: (IPC::Connection::platformInvalidate): Adopt new 'safe mach_port_t deallocation' function. (IPC::Connection::initializeSendSource): Ditto. (IPC::Connection::receiveSourceEventHandler): Ditto. * Platform/SharedMemory.h: * Platform/cocoa/SharedMemoryCocoa.cpp: (WebKit::SharedMemory::Handle::clear): Ditto. (WebKit::makeMemoryEntry): Ditto. (WebKit::SharedMemory::createSendRight const): Ditto. * Platform/mac/LayerHostingContext.h: * Platform/mac/LayerHostingContext.mm: * PluginProcess/PluginControllerProxy.h: * PluginProcess/PluginProcess.h: (WebKit::PluginProcess::compositingRenderServerPort const): * Scripts/messages.py: (headers_for_type): Update for new location of MachSendRight. * Shared/Plugins/PluginProcessCreationParameters.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm: (WebKit::RemoteLayerBackingStore::encode const): * Shared/WebCoreArgumentCoders.h: * Shared/WebProcessCreationParameters.h: * Shared/mac/WebCoreArgumentCodersMac.mm: * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: * UIProcess/DrawingAreaProxy.cpp: * UIProcess/DrawingAreaProxy.h: * UIProcess/Launcher/mac/ProcessLauncherMac.mm: (WebKit::ProcessLauncher::launchProcess): Ditto. Remove uneeded mach_port_dealloc called after xpc_dictionary_set_mach_send. While '..._set_mach_send' retains the send right, it gets automatically released when the message is handled. We only want to manually deallocate the send right if the message failed to send. * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: * UIProcess/WebPageProxy.cpp: * UIProcess/WebPageProxy.h: * UIProcess/WebPageProxy.messages.in: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm: * UIProcess/mac/WKViewLayoutStrategy.mm: * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp: * WebProcess/Plugins/Netscape/NetscapePlugin.h: * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm: * WebProcess/Plugins/PluginController.h: * WebProcess/Plugins/PluginView.h: * WebProcess/WebPage/DrawingArea.h: (WebKit::DrawingArea::addFence): (WebKit::DrawingArea::updateGeometry): * WebProcess/WebPage/DrawingArea.messages.in: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::updateGeometry): * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::setTopContentInsetFenced): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::updateGeometry): * WebProcess/WebProcess.h: (WebKit::WebProcess::compositingRenderServerPort const): * WebProcess/cocoa/VideoFullscreenManager.mm: (WebKit::VideoFullscreenManager::setVideoLayerFrameFenced): Source/WebKitLegacy/mac: * Plugins/Hosted/NetscapePluginHostManager.mm: (WebKit::NetscapePluginHostManager::spawnPluginHost): Adopt new 'safe mach_port_t deallocation' function. Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/MachSendRight.h: Copied from WebCore/platform/cocoa/MachSendRight.h. (WebCore::MachSendRight::operator bool const): Deleted. (WebCore::MachSendRight::sendRight const): Deleted. * wtf/PlatformMac.cmake: * wtf/cocoa/CPUTimeCocoa.mm: (WTF::CPUTime::forCurrentThread): Do proper cleanup if the port is invalid. * wtf/cocoa/MachSendRight.cpp: Copied from WebCore/platform/cocoa/MachSendRight.cpp. (WTF::retainSendRight): (WTF::releaseSendRight): (WTF::deallocateSendRightSafely): (WebCore::retainSendRight): Deleted. (WebCore::releaseSendRight): Deleted. (WebCore::MachSendRight::adopt): Deleted. (WebCore::MachSendRight::create): Deleted. (WebCore::MachSendRight::MachSendRight): Deleted. (WebCore::MachSendRight::~MachSendRight): Deleted. (WebCore::MachSendRight::operator=): Deleted. (WebCore::MachSendRight::copySendRight const): Deleted. (WebCore::MachSendRight::leakSendRight): Deleted. Canonical link: https://commits.webkit.org/199860@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@230269 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-04-04 19:43:01 +00:00
namespace WTF {
class MachSendRight {
[WTF][JSC] Make JSC and WTF aggressively-fast-malloced https://bugs.webkit.org/show_bug.cgi?id=200611 Reviewed by Saam Barati. Source/JavaScriptCore: This patch aggressively puts many classes into FastMalloc. In JSC side, we grep `std::make_unique` etc. to find potentially system-malloc-allocated classes. After this patch, all the JSC related allocations in JetStream2 cli is done from bmalloc. In the future, it would be nice that we add `WTF::makeUnique<T>` helper function and throw a compile error if `T` is not FastMalloc annotated[1]. Putting WebKit classes in FastMalloc has many benefits. 1. Simply, it is fast. 2. vmmap can tell the amount of memory used for WebKit. 3. bmalloc can isolate WebKit memory allocation from the rest of the world. This is useful since we can know more about what component is corrupting the memory from the memory corruption crash. [1]: https://bugs.webkit.org/show_bug.cgi?id=200620 * API/ObjCCallbackFunction.mm: * assembler/AbstractMacroAssembler.h: * b3/B3PhiChildren.h: * b3/air/AirAllocateRegistersAndStackAndGenerateCode.h: * b3/air/AirDisassembler.h: * bytecode/AccessCaseSnippetParams.h: * bytecode/CallVariant.h: * bytecode/DeferredSourceDump.h: * bytecode/ExecutionCounter.h: * bytecode/GetByIdStatus.h: * bytecode/GetByIdVariant.h: * bytecode/InByIdStatus.h: * bytecode/InByIdVariant.h: * bytecode/InstanceOfStatus.h: * bytecode/InstanceOfVariant.h: * bytecode/PutByIdStatus.h: * bytecode/PutByIdVariant.h: * bytecode/ValueProfile.h: * dfg/DFGAbstractInterpreter.h: * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::newVariableAccessData): * dfg/DFGFlowIndexing.h: * dfg/DFGFlowMap.h: * dfg/DFGLiveCatchVariablePreservationPhase.cpp: (JSC::DFG::LiveCatchVariablePreservationPhase::newVariableAccessData): * dfg/DFGMaximalFlushInsertionPhase.cpp: (JSC::DFG::MaximalFlushInsertionPhase::newVariableAccessData): * dfg/DFGOSRExit.h: * dfg/DFGSpeculativeJIT.h: * dfg/DFGVariableAccessData.h: * disassembler/ARM64/A64DOpcode.h: * inspector/remote/socket/RemoteInspectorMessageParser.h: * inspector/remote/socket/RemoteInspectorSocket.h: * inspector/remote/socket/RemoteInspectorSocketEndpoint.h: * jit/PCToCodeOriginMap.h: * runtime/BasicBlockLocation.h: * runtime/DoublePredictionFuzzerAgent.h: * runtime/JSRunLoopTimer.h: * runtime/PromiseDeferredTimer.h: (JSC::PromiseDeferredTimer::create): PromiseDeferredTimer should be allocated as `Ref<>` instead of `std::unique_ptr` since it is inheriting ThreadSafeRefCounted<>. Holding such a class with std::unique_ptr could lead to potentially dangerous operations (like, someone holds it with Ref<> while it is deleted by std::unique_ptr<>). * runtime/RandomizingFuzzerAgent.h: * runtime/SymbolTable.h: * runtime/VM.cpp: (JSC::VM::VM): * runtime/VM.h: * tools/JSDollarVM.cpp: * tools/SigillCrashAnalyzer.cpp: * wasm/WasmFormat.h: * wasm/WasmMemory.cpp: * wasm/WasmSignature.h: * yarr/YarrJIT.h: Source/WebCore: Changed the accessor since we changed std::unique_ptr to Ref for this field. No behavior change. * bindings/js/WorkerScriptController.cpp: (WebCore::WorkerScriptController::addTimerSetNotification): (WebCore::WorkerScriptController::removeTimerSetNotification): Source/WTF: WTF has many data structures, in particular, containers. And these containers can be allocated like `std::make_unique<Container>()`. Without WTF_MAKE_FAST_ALLOCATED, this container itself is allocated from the system malloc. This patch attaches WTF_MAKE_FAST_ALLOCATED more aggressively not to allocate them from the system malloc. And we add some `final` to containers and classes that would be never inherited. * wtf/Assertions.cpp: * wtf/Atomics.h: * wtf/AutodrainedPool.h: * wtf/Bag.h: (WTF::Bag::Bag): Deleted. (WTF::Bag::~Bag): Deleted. (WTF::Bag::clear): Deleted. (WTF::Bag::add): Deleted. (WTF::Bag::iterator::iterator): Deleted. (WTF::Bag::iterator::operator! const): Deleted. (WTF::Bag::iterator::operator* const): Deleted. (WTF::Bag::iterator::operator++): Deleted. (WTF::Bag::iterator::operator== const): Deleted. (WTF::Bag::iterator::operator!= const): Deleted. (WTF::Bag::begin): Deleted. (WTF::Bag::begin const): Deleted. (WTF::Bag::end const): Deleted. (WTF::Bag::isEmpty const): Deleted. (WTF::Bag::unwrappedHead const): Deleted. * wtf/BitVector.h: (WTF::BitVector::BitVector): Deleted. (WTF::BitVector::~BitVector): Deleted. (WTF::BitVector::operator=): Deleted. (WTF::BitVector::size const): Deleted. (WTF::BitVector::ensureSize): Deleted. (WTF::BitVector::quickGet const): Deleted. (WTF::BitVector::quickSet): Deleted. (WTF::BitVector::quickClear): Deleted. (WTF::BitVector::get const): Deleted. (WTF::BitVector::contains const): Deleted. (WTF::BitVector::set): Deleted. (WTF::BitVector::add): Deleted. (WTF::BitVector::ensureSizeAndSet): Deleted. (WTF::BitVector::clear): Deleted. (WTF::BitVector::remove): Deleted. (WTF::BitVector::merge): Deleted. (WTF::BitVector::filter): Deleted. (WTF::BitVector::exclude): Deleted. (WTF::BitVector::bitCount const): Deleted. (WTF::BitVector::isEmpty const): Deleted. (WTF::BitVector::findBit const): Deleted. (WTF::BitVector::isEmptyValue const): Deleted. (WTF::BitVector::isDeletedValue const): Deleted. (WTF::BitVector::isEmptyOrDeletedValue const): Deleted. (WTF::BitVector::operator== const): Deleted. (WTF::BitVector::hash const): Deleted. (WTF::BitVector::iterator::iterator): Deleted. (WTF::BitVector::iterator::operator* const): Deleted. (WTF::BitVector::iterator::operator++): Deleted. (WTF::BitVector::iterator::isAtEnd const): Deleted. (WTF::BitVector::iterator::operator== const): Deleted. (WTF::BitVector::iterator::operator!= const): Deleted. (WTF::BitVector::begin const): Deleted. (WTF::BitVector::end const): Deleted. (WTF::BitVector::bitsInPointer): Deleted. (WTF::BitVector::maxInlineBits): Deleted. (WTF::BitVector::byteCount): Deleted. (WTF::BitVector::makeInlineBits): Deleted. (WTF::BitVector::cleanseInlineBits): Deleted. (WTF::BitVector::bitCount): Deleted. (WTF::BitVector::findBitFast const): Deleted. (WTF::BitVector::findBitSimple const): Deleted. (WTF::BitVector::OutOfLineBits::numBits const): Deleted. (WTF::BitVector::OutOfLineBits::numWords const): Deleted. (WTF::BitVector::OutOfLineBits::bits): Deleted. (WTF::BitVector::OutOfLineBits::bits const): Deleted. (WTF::BitVector::OutOfLineBits::OutOfLineBits): Deleted. (WTF::BitVector::isInline const): Deleted. (WTF::BitVector::outOfLineBits const): Deleted. (WTF::BitVector::outOfLineBits): Deleted. (WTF::BitVector::bits): Deleted. (WTF::BitVector::bits const): Deleted. * wtf/Bitmap.h: (WTF::Bitmap::size): Deleted. (WTF::Bitmap::iterator::iterator): Deleted. (WTF::Bitmap::iterator::operator* const): Deleted. (WTF::Bitmap::iterator::operator++): Deleted. (WTF::Bitmap::iterator::operator== const): Deleted. (WTF::Bitmap::iterator::operator!= const): Deleted. (WTF::Bitmap::begin const): Deleted. (WTF::Bitmap::end const): Deleted. * wtf/Box.h: * wtf/BumpPointerAllocator.h: * wtf/CPUTime.h: * wtf/CheckedBoolean.h: * wtf/CommaPrinter.h: (WTF::CommaPrinter::CommaPrinter): Deleted. (WTF::CommaPrinter::dump const): Deleted. (WTF::CommaPrinter::didPrint const): Deleted. * wtf/CompactPointerTuple.h: (WTF::CompactPointerTuple::encodeType): Deleted. (WTF::CompactPointerTuple::decodeType): Deleted. (WTF::CompactPointerTuple::CompactPointerTuple): Deleted. (WTF::CompactPointerTuple::pointer const): Deleted. (WTF::CompactPointerTuple::setPointer): Deleted. (WTF::CompactPointerTuple::type const): Deleted. (WTF::CompactPointerTuple::setType): Deleted. * wtf/CompilationThread.h: (WTF::CompilationScope::CompilationScope): Deleted. (WTF::CompilationScope::~CompilationScope): Deleted. (WTF::CompilationScope::leaveEarly): Deleted. * wtf/CompletionHandler.h: (WTF::CompletionHandler<Out): (WTF::Detail::CallableWrapper<CompletionHandler<Out): (WTF::CompletionHandlerCallingScope::CompletionHandlerCallingScope): Deleted. (WTF::CompletionHandlerCallingScope::~CompletionHandlerCallingScope): Deleted. (WTF::CompletionHandlerCallingScope::CompletionHandler<void): Deleted. * wtf/ConcurrentBuffer.h: (WTF::ConcurrentBuffer::ConcurrentBuffer): Deleted. (WTF::ConcurrentBuffer::~ConcurrentBuffer): Deleted. (WTF::ConcurrentBuffer::growExact): Deleted. (WTF::ConcurrentBuffer::grow): Deleted. (WTF::ConcurrentBuffer::array const): Deleted. (WTF::ConcurrentBuffer::operator[]): Deleted. (WTF::ConcurrentBuffer::operator[] const): Deleted. (WTF::ConcurrentBuffer::createArray): Deleted. * wtf/ConcurrentPtrHashSet.h: (WTF::ConcurrentPtrHashSet::contains): Deleted. (WTF::ConcurrentPtrHashSet::add): Deleted. (WTF::ConcurrentPtrHashSet::size const): Deleted. (WTF::ConcurrentPtrHashSet::Table::maxLoad const): Deleted. (WTF::ConcurrentPtrHashSet::hash): Deleted. (WTF::ConcurrentPtrHashSet::cast): Deleted. (WTF::ConcurrentPtrHashSet::containsImpl const): Deleted. (WTF::ConcurrentPtrHashSet::addImpl): Deleted. * wtf/ConcurrentVector.h: (WTF::ConcurrentVector::~ConcurrentVector): Deleted. (WTF::ConcurrentVector::size const): Deleted. (WTF::ConcurrentVector::isEmpty const): Deleted. (WTF::ConcurrentVector::at): Deleted. (WTF::ConcurrentVector::at const): Deleted. (WTF::ConcurrentVector::operator[]): Deleted. (WTF::ConcurrentVector::operator[] const): Deleted. (WTF::ConcurrentVector::first): Deleted. (WTF::ConcurrentVector::first const): Deleted. (WTF::ConcurrentVector::last): Deleted. (WTF::ConcurrentVector::last const): Deleted. (WTF::ConcurrentVector::takeLast): Deleted. (WTF::ConcurrentVector::append): Deleted. (WTF::ConcurrentVector::alloc): Deleted. (WTF::ConcurrentVector::removeLast): Deleted. (WTF::ConcurrentVector::grow): Deleted. (WTF::ConcurrentVector::begin): Deleted. (WTF::ConcurrentVector::end): Deleted. (WTF::ConcurrentVector::segmentExistsFor): Deleted. (WTF::ConcurrentVector::segmentFor): Deleted. (WTF::ConcurrentVector::subscriptFor): Deleted. (WTF::ConcurrentVector::ensureSegmentsFor): Deleted. (WTF::ConcurrentVector::ensureSegment): Deleted. (WTF::ConcurrentVector::allocateSegment): Deleted. * wtf/Condition.h: (WTF::Condition::waitUntil): Deleted. (WTF::Condition::waitFor): Deleted. (WTF::Condition::wait): Deleted. (WTF::Condition::notifyOne): Deleted. (WTF::Condition::notifyAll): Deleted. * wtf/CountingLock.h: (WTF::CountingLock::LockHooks::lockHook): Deleted. (WTF::CountingLock::LockHooks::unlockHook): Deleted. (WTF::CountingLock::LockHooks::parkHook): Deleted. (WTF::CountingLock::LockHooks::handoffHook): Deleted. (WTF::CountingLock::tryLock): Deleted. (WTF::CountingLock::lock): Deleted. (WTF::CountingLock::unlock): Deleted. (WTF::CountingLock::isHeld const): Deleted. (WTF::CountingLock::isLocked const): Deleted. (WTF::CountingLock::Count::operator bool const): Deleted. (WTF::CountingLock::Count::operator== const): Deleted. (WTF::CountingLock::Count::operator!= const): Deleted. (WTF::CountingLock::tryOptimisticRead): Deleted. (WTF::CountingLock::validate): Deleted. (WTF::CountingLock::doOptimizedRead): Deleted. (WTF::CountingLock::tryOptimisticFencelessRead): Deleted. (WTF::CountingLock::fencelessValidate): Deleted. (WTF::CountingLock::doOptimizedFencelessRead): Deleted. (WTF::CountingLock::getCount): Deleted. * wtf/CrossThreadQueue.h: * wtf/CrossThreadTask.h: * wtf/CryptographicallyRandomNumber.cpp: * wtf/DataMutex.h: * wtf/DateMath.h: * wtf/Deque.h: (WTF::Deque::size const): Deleted. (WTF::Deque::isEmpty const): Deleted. (WTF::Deque::begin): Deleted. (WTF::Deque::end): Deleted. (WTF::Deque::begin const): Deleted. (WTF::Deque::end const): Deleted. (WTF::Deque::rbegin): Deleted. (WTF::Deque::rend): Deleted. (WTF::Deque::rbegin const): Deleted. (WTF::Deque::rend const): Deleted. (WTF::Deque::first): Deleted. (WTF::Deque::first const): Deleted. (WTF::Deque::last): Deleted. (WTF::Deque::last const): Deleted. (WTF::Deque::append): Deleted. * wtf/Dominators.h: * wtf/DoublyLinkedList.h: * wtf/Expected.h: * wtf/FastBitVector.h: * wtf/FileMetadata.h: * wtf/FileSystem.h: * wtf/GraphNodeWorklist.h: * wtf/GregorianDateTime.h: (WTF::GregorianDateTime::GregorianDateTime): Deleted. (WTF::GregorianDateTime::year const): Deleted. (WTF::GregorianDateTime::month const): Deleted. (WTF::GregorianDateTime::yearDay const): Deleted. (WTF::GregorianDateTime::monthDay const): Deleted. (WTF::GregorianDateTime::weekDay const): Deleted. (WTF::GregorianDateTime::hour const): Deleted. (WTF::GregorianDateTime::minute const): Deleted. (WTF::GregorianDateTime::second const): Deleted. (WTF::GregorianDateTime::utcOffset const): Deleted. (WTF::GregorianDateTime::isDST const): Deleted. (WTF::GregorianDateTime::setYear): Deleted. (WTF::GregorianDateTime::setMonth): Deleted. (WTF::GregorianDateTime::setYearDay): Deleted. (WTF::GregorianDateTime::setMonthDay): Deleted. (WTF::GregorianDateTime::setWeekDay): Deleted. (WTF::GregorianDateTime::setHour): Deleted. (WTF::GregorianDateTime::setMinute): Deleted. (WTF::GregorianDateTime::setSecond): Deleted. (WTF::GregorianDateTime::setUtcOffset): Deleted. (WTF::GregorianDateTime::setIsDST): Deleted. (WTF::GregorianDateTime::operator tm const): Deleted. (WTF::GregorianDateTime::copyFrom): Deleted. * wtf/HashTable.h: * wtf/Hasher.h: * wtf/HexNumber.h: * wtf/Indenter.h: * wtf/IndexMap.h: * wtf/IndexSet.h: * wtf/IndexSparseSet.h: * wtf/IndexedContainerIterator.h: * wtf/Insertion.h: * wtf/IteratorAdaptors.h: * wtf/IteratorRange.h: * wtf/KeyValuePair.h: * wtf/ListHashSet.h: (WTF::ListHashSet::begin): Deleted. (WTF::ListHashSet::end): Deleted. (WTF::ListHashSet::begin const): Deleted. (WTF::ListHashSet::end const): Deleted. (WTF::ListHashSet::random): Deleted. (WTF::ListHashSet::random const): Deleted. (WTF::ListHashSet::rbegin): Deleted. (WTF::ListHashSet::rend): Deleted. (WTF::ListHashSet::rbegin const): Deleted. (WTF::ListHashSet::rend const): Deleted. * wtf/Liveness.h: * wtf/LocklessBag.h: (WTF::LocklessBag::LocklessBag): Deleted. (WTF::LocklessBag::add): Deleted. (WTF::LocklessBag::iterate): Deleted. (WTF::LocklessBag::consumeAll): Deleted. (WTF::LocklessBag::consumeAllWithNode): Deleted. (WTF::LocklessBag::~LocklessBag): Deleted. * wtf/LoggingHashID.h: * wtf/MD5.h: * wtf/MachSendRight.h: * wtf/MainThreadData.h: * wtf/Markable.h: * wtf/MediaTime.h: * wtf/MemoryPressureHandler.h: * wtf/MessageQueue.h: (WTF::MessageQueue::MessageQueue): Deleted. * wtf/MetaAllocator.h: * wtf/MonotonicTime.h: (WTF::MonotonicTime::MonotonicTime): Deleted. (WTF::MonotonicTime::fromRawSeconds): Deleted. (WTF::MonotonicTime::infinity): Deleted. (WTF::MonotonicTime::nan): Deleted. (WTF::MonotonicTime::secondsSinceEpoch const): Deleted. (WTF::MonotonicTime::approximateMonotonicTime const): Deleted. (WTF::MonotonicTime::operator bool const): Deleted. (WTF::MonotonicTime::operator+ const): Deleted. (WTF::MonotonicTime::operator- const): Deleted. (WTF::MonotonicTime::operator% const): Deleted. (WTF::MonotonicTime::operator+=): Deleted. (WTF::MonotonicTime::operator-=): Deleted. (WTF::MonotonicTime::operator== const): Deleted. (WTF::MonotonicTime::operator!= const): Deleted. (WTF::MonotonicTime::operator< const): Deleted. (WTF::MonotonicTime::operator> const): Deleted. (WTF::MonotonicTime::operator<= const): Deleted. (WTF::MonotonicTime::operator>= const): Deleted. (WTF::MonotonicTime::isolatedCopy const): Deleted. (WTF::MonotonicTime::encode const): Deleted. (WTF::MonotonicTime::decode): Deleted. * wtf/NaturalLoops.h: * wtf/NoLock.h: * wtf/OSAllocator.h: * wtf/OptionSet.h: * wtf/Optional.h: * wtf/OrderMaker.h: * wtf/Packed.h: (WTF::alignof): * wtf/PackedIntVector.h: (WTF::PackedIntVector::PackedIntVector): Deleted. (WTF::PackedIntVector::operator=): Deleted. (WTF::PackedIntVector::size const): Deleted. (WTF::PackedIntVector::ensureSize): Deleted. (WTF::PackedIntVector::resize): Deleted. (WTF::PackedIntVector::clearAll): Deleted. (WTF::PackedIntVector::get const): Deleted. (WTF::PackedIntVector::set): Deleted. (WTF::PackedIntVector::mask): Deleted. * wtf/PageBlock.h: * wtf/ParallelJobsOpenMP.h: * wtf/ParkingLot.h: * wtf/PriorityQueue.h: (WTF::PriorityQueue::size const): Deleted. (WTF::PriorityQueue::isEmpty const): Deleted. (WTF::PriorityQueue::enqueue): Deleted. (WTF::PriorityQueue::peek const): Deleted. (WTF::PriorityQueue::dequeue): Deleted. (WTF::PriorityQueue::decreaseKey): Deleted. (WTF::PriorityQueue::increaseKey): Deleted. (WTF::PriorityQueue::begin const): Deleted. (WTF::PriorityQueue::end const): Deleted. (WTF::PriorityQueue::isValidHeap const): Deleted. (WTF::PriorityQueue::parentOf): Deleted. (WTF::PriorityQueue::leftChildOf): Deleted. (WTF::PriorityQueue::rightChildOf): Deleted. (WTF::PriorityQueue::siftUp): Deleted. (WTF::PriorityQueue::siftDown): Deleted. * wtf/RandomDevice.h: * wtf/Range.h: * wtf/RangeSet.h: (WTF::RangeSet::RangeSet): Deleted. (WTF::RangeSet::~RangeSet): Deleted. (WTF::RangeSet::add): Deleted. (WTF::RangeSet::contains const): Deleted. (WTF::RangeSet::overlaps const): Deleted. (WTF::RangeSet::clear): Deleted. (WTF::RangeSet::dump const): Deleted. (WTF::RangeSet::dumpRaw const): Deleted. (WTF::RangeSet::begin const): Deleted. (WTF::RangeSet::end const): Deleted. (WTF::RangeSet::addAll): Deleted. (WTF::RangeSet::compact): Deleted. (WTF::RangeSet::overlapsNonEmpty): Deleted. (WTF::RangeSet::subsumesNonEmpty): Deleted. (WTF::RangeSet::findRange const): Deleted. * wtf/RecursableLambda.h: * wtf/RedBlackTree.h: (WTF::RedBlackTree::Node::successor const): Deleted. (WTF::RedBlackTree::Node::predecessor const): Deleted. (WTF::RedBlackTree::Node::successor): Deleted. (WTF::RedBlackTree::Node::predecessor): Deleted. (WTF::RedBlackTree::Node::reset): Deleted. (WTF::RedBlackTree::Node::parent const): Deleted. (WTF::RedBlackTree::Node::setParent): Deleted. (WTF::RedBlackTree::Node::left const): Deleted. (WTF::RedBlackTree::Node::setLeft): Deleted. (WTF::RedBlackTree::Node::right const): Deleted. (WTF::RedBlackTree::Node::setRight): Deleted. (WTF::RedBlackTree::Node::color const): Deleted. (WTF::RedBlackTree::Node::setColor): Deleted. (WTF::RedBlackTree::RedBlackTree): Deleted. (WTF::RedBlackTree::insert): Deleted. (WTF::RedBlackTree::remove): Deleted. (WTF::RedBlackTree::findExact const): Deleted. (WTF::RedBlackTree::findLeastGreaterThanOrEqual const): Deleted. (WTF::RedBlackTree::findGreatestLessThanOrEqual const): Deleted. (WTF::RedBlackTree::first const): Deleted. (WTF::RedBlackTree::last const): Deleted. (WTF::RedBlackTree::size): Deleted. (WTF::RedBlackTree::isEmpty): Deleted. (WTF::RedBlackTree::treeMinimum): Deleted. (WTF::RedBlackTree::treeMaximum): Deleted. (WTF::RedBlackTree::treeInsert): Deleted. (WTF::RedBlackTree::leftRotate): Deleted. (WTF::RedBlackTree::rightRotate): Deleted. (WTF::RedBlackTree::removeFixup): Deleted. * wtf/ResourceUsage.h: * wtf/RunLoop.cpp: * wtf/RunLoopTimer.h: * wtf/SHA1.h: * wtf/Seconds.h: (WTF::Seconds::Seconds): Deleted. (WTF::Seconds::value const): Deleted. (WTF::Seconds::minutes const): Deleted. (WTF::Seconds::seconds const): Deleted. (WTF::Seconds::milliseconds const): Deleted. (WTF::Seconds::microseconds const): Deleted. (WTF::Seconds::nanoseconds const): Deleted. (WTF::Seconds::minutesAs const): Deleted. (WTF::Seconds::secondsAs const): Deleted. (WTF::Seconds::millisecondsAs const): Deleted. (WTF::Seconds::microsecondsAs const): Deleted. (WTF::Seconds::nanosecondsAs const): Deleted. (WTF::Seconds::fromMinutes): Deleted. (WTF::Seconds::fromHours): Deleted. (WTF::Seconds::fromMilliseconds): Deleted. (WTF::Seconds::fromMicroseconds): Deleted. (WTF::Seconds::fromNanoseconds): Deleted. (WTF::Seconds::infinity): Deleted. (WTF::Seconds::nan): Deleted. (WTF::Seconds::operator bool const): Deleted. (WTF::Seconds::operator+ const): Deleted. (WTF::Seconds::operator- const): Deleted. (WTF::Seconds::operator* const): Deleted. (WTF::Seconds::operator/ const): Deleted. (WTF::Seconds::operator% const): Deleted. (WTF::Seconds::operator+=): Deleted. (WTF::Seconds::operator-=): Deleted. (WTF::Seconds::operator*=): Deleted. (WTF::Seconds::operator/=): Deleted. (WTF::Seconds::operator%=): Deleted. (WTF::Seconds::operator== const): Deleted. (WTF::Seconds::operator!= const): Deleted. (WTF::Seconds::operator< const): Deleted. (WTF::Seconds::operator> const): Deleted. (WTF::Seconds::operator<= const): Deleted. (WTF::Seconds::operator>= const): Deleted. (WTF::Seconds::isolatedCopy const): Deleted. (WTF::Seconds::encode const): Deleted. (WTF::Seconds::decode): Deleted. * wtf/SegmentedVector.h: (WTF::SegmentedVector::~SegmentedVector): Deleted. (WTF::SegmentedVector::size const): Deleted. (WTF::SegmentedVector::isEmpty const): Deleted. (WTF::SegmentedVector::at): Deleted. (WTF::SegmentedVector::at const): Deleted. (WTF::SegmentedVector::operator[]): Deleted. (WTF::SegmentedVector::operator[] const): Deleted. (WTF::SegmentedVector::first): Deleted. (WTF::SegmentedVector::first const): Deleted. (WTF::SegmentedVector::last): Deleted. (WTF::SegmentedVector::last const): Deleted. (WTF::SegmentedVector::takeLast): Deleted. (WTF::SegmentedVector::append): Deleted. (WTF::SegmentedVector::alloc): Deleted. (WTF::SegmentedVector::removeLast): Deleted. (WTF::SegmentedVector::grow): Deleted. (WTF::SegmentedVector::clear): Deleted. (WTF::SegmentedVector::begin): Deleted. (WTF::SegmentedVector::end): Deleted. (WTF::SegmentedVector::shrinkToFit): Deleted. (WTF::SegmentedVector::deleteAllSegments): Deleted. (WTF::SegmentedVector::segmentExistsFor): Deleted. (WTF::SegmentedVector::segmentFor): Deleted. (WTF::SegmentedVector::subscriptFor): Deleted. (WTF::SegmentedVector::ensureSegmentsFor): Deleted. (WTF::SegmentedVector::ensureSegment): Deleted. (WTF::SegmentedVector::allocateSegment): Deleted. * wtf/SetForScope.h: * wtf/SingleRootGraph.h: * wtf/SinglyLinkedList.h: * wtf/SmallPtrSet.h: * wtf/SpanningTree.h: * wtf/Spectrum.h: * wtf/StackBounds.h: * wtf/StackShot.h: * wtf/StackShotProfiler.h: * wtf/StackStats.h: * wtf/StackTrace.h: * wtf/StreamBuffer.h: * wtf/SynchronizedFixedQueue.h: (WTF::SynchronizedFixedQueue::create): Deleted. (WTF::SynchronizedFixedQueue::open): Deleted. (WTF::SynchronizedFixedQueue::close): Deleted. (WTF::SynchronizedFixedQueue::isOpen): Deleted. (WTF::SynchronizedFixedQueue::enqueue): Deleted. (WTF::SynchronizedFixedQueue::dequeue): Deleted. (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue): Deleted. * wtf/SystemTracing.h: * wtf/ThreadGroup.h: (WTF::ThreadGroup::create): Deleted. (WTF::ThreadGroup::threads const): Deleted. (WTF::ThreadGroup::getLock): Deleted. (WTF::ThreadGroup::weakFromThis): Deleted. * wtf/ThreadSpecific.h: * wtf/ThreadingPrimitives.h: (WTF::Mutex::impl): Deleted. * wtf/TimeWithDynamicClockType.h: (WTF::TimeWithDynamicClockType::TimeWithDynamicClockType): Deleted. (WTF::TimeWithDynamicClockType::fromRawSeconds): Deleted. (WTF::TimeWithDynamicClockType::secondsSinceEpoch const): Deleted. (WTF::TimeWithDynamicClockType::clockType const): Deleted. (WTF::TimeWithDynamicClockType::withSameClockAndRawSeconds const): Deleted. (WTF::TimeWithDynamicClockType::operator bool const): Deleted. (WTF::TimeWithDynamicClockType::operator+ const): Deleted. (WTF::TimeWithDynamicClockType::operator- const): Deleted. (WTF::TimeWithDynamicClockType::operator+=): Deleted. (WTF::TimeWithDynamicClockType::operator-=): Deleted. (WTF::TimeWithDynamicClockType::operator== const): Deleted. (WTF::TimeWithDynamicClockType::operator!= const): Deleted. * wtf/TimingScope.h: * wtf/TinyLRUCache.h: * wtf/TinyPtrSet.h: * wtf/URLParser.cpp: * wtf/URLParser.h: * wtf/Unexpected.h: * wtf/Variant.h: * wtf/WTFSemaphore.h: (WTF::Semaphore::Semaphore): Deleted. (WTF::Semaphore::signal): Deleted. (WTF::Semaphore::waitUntil): Deleted. (WTF::Semaphore::waitFor): Deleted. (WTF::Semaphore::wait): Deleted. * wtf/WallTime.h: (WTF::WallTime::WallTime): Deleted. (WTF::WallTime::fromRawSeconds): Deleted. (WTF::WallTime::infinity): Deleted. (WTF::WallTime::nan): Deleted. (WTF::WallTime::secondsSinceEpoch const): Deleted. (WTF::WallTime::approximateWallTime const): Deleted. (WTF::WallTime::operator bool const): Deleted. (WTF::WallTime::operator+ const): Deleted. (WTF::WallTime::operator- const): Deleted. (WTF::WallTime::operator+=): Deleted. (WTF::WallTime::operator-=): Deleted. (WTF::WallTime::operator== const): Deleted. (WTF::WallTime::operator!= const): Deleted. (WTF::WallTime::operator< const): Deleted. (WTF::WallTime::operator> const): Deleted. (WTF::WallTime::operator<= const): Deleted. (WTF::WallTime::operator>= const): Deleted. (WTF::WallTime::isolatedCopy const): Deleted. * wtf/WeakHashSet.h: (WTF::WeakHashSet::WeakHashSetConstIterator::WeakHashSetConstIterator): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::get const): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::operator* const): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::operator-> const): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::operator++): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::skipEmptyBuckets): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::operator== const): Deleted. (WTF::WeakHashSet::WeakHashSetConstIterator::operator!= const): Deleted. (WTF::WeakHashSet::WeakHashSet): Deleted. (WTF::WeakHashSet::begin const): Deleted. (WTF::WeakHashSet::end const): Deleted. (WTF::WeakHashSet::add): Deleted. (WTF::WeakHashSet::remove): Deleted. (WTF::WeakHashSet::contains const): Deleted. (WTF::WeakHashSet::capacity const): Deleted. (WTF::WeakHashSet::computesEmpty const): Deleted. (WTF::WeakHashSet::hasNullReferences const): Deleted. (WTF::WeakHashSet::computeSize const): Deleted. (WTF::WeakHashSet::checkConsistency const): Deleted. * wtf/WeakRandom.h: (WTF::WeakRandom::WeakRandom): Deleted. (WTF::WeakRandom::setSeed): Deleted. (WTF::WeakRandom::seed const): Deleted. (WTF::WeakRandom::get): Deleted. (WTF::WeakRandom::getUint32): Deleted. (WTF::WeakRandom::lowOffset): Deleted. (WTF::WeakRandom::highOffset): Deleted. (WTF::WeakRandom::nextState): Deleted. (WTF::WeakRandom::generate): Deleted. (WTF::WeakRandom::advance): Deleted. * wtf/WordLock.h: (WTF::WordLock::lock): Deleted. (WTF::WordLock::unlock): Deleted. (WTF::WordLock::isHeld const): Deleted. (WTF::WordLock::isLocked const): Deleted. (WTF::WordLock::isFullyReset const): Deleted. * wtf/generic/MainThreadGeneric.cpp: * wtf/glib/GMutexLocker.h: * wtf/linux/CurrentProcessMemoryStatus.h: * wtf/posix/ThreadingPOSIX.cpp: (WTF::Semaphore::Semaphore): Deleted. (WTF::Semaphore::~Semaphore): Deleted. (WTF::Semaphore::wait): Deleted. (WTF::Semaphore::post): Deleted. * wtf/text/ASCIILiteral.h: (WTF::ASCIILiteral::operator const char* const): Deleted. (WTF::ASCIILiteral::fromLiteralUnsafe): Deleted. (WTF::ASCIILiteral::null): Deleted. (WTF::ASCIILiteral::characters const): Deleted. (WTF::ASCIILiteral::ASCIILiteral): Deleted. * wtf/text/AtomString.h: (WTF::AtomString::operator=): Deleted. (WTF::AtomString::isHashTableDeletedValue const): Deleted. (WTF::AtomString::existingHash const): Deleted. (WTF::AtomString::operator const String& const): Deleted. (WTF::AtomString::string const): Deleted. (WTF::AtomString::impl const): Deleted. (WTF::AtomString::is8Bit const): Deleted. (WTF::AtomString::characters8 const): Deleted. (WTF::AtomString::characters16 const): Deleted. (WTF::AtomString::length const): Deleted. (WTF::AtomString::operator[] const): Deleted. (WTF::AtomString::contains const): Deleted. (WTF::AtomString::containsIgnoringASCIICase const): Deleted. (WTF::AtomString::find const): Deleted. (WTF::AtomString::findIgnoringASCIICase const): Deleted. (WTF::AtomString::startsWith const): Deleted. (WTF::AtomString::startsWithIgnoringASCIICase const): Deleted. (WTF::AtomString::endsWith const): Deleted. (WTF::AtomString::endsWithIgnoringASCIICase const): Deleted. (WTF::AtomString::toInt const): Deleted. (WTF::AtomString::toDouble const): Deleted. (WTF::AtomString::toFloat const): Deleted. (WTF::AtomString::percentage const): Deleted. (WTF::AtomString::isNull const): Deleted. (WTF::AtomString::isEmpty const): Deleted. (WTF::AtomString::operator NSString * const): Deleted. * wtf/text/AtomStringImpl.h: (WTF::AtomStringImpl::lookUp): Deleted. (WTF::AtomStringImpl::add): Deleted. (WTF::AtomStringImpl::addWithStringTableProvider): Deleted. * wtf/text/CString.h: (WTF::CStringBuffer::data): Deleted. (WTF::CStringBuffer::length const): Deleted. (WTF::CStringBuffer::CStringBuffer): Deleted. (WTF::CStringBuffer::mutableData): Deleted. (WTF::CString::CString): Deleted. (WTF::CString::data const): Deleted. (WTF::CString::length const): Deleted. (WTF::CString::isNull const): Deleted. (WTF::CString::buffer const): Deleted. (WTF::CString::isHashTableDeletedValue const): Deleted. * wtf/text/ExternalStringImpl.h: (WTF::ExternalStringImpl::freeExternalBuffer): Deleted. * wtf/text/LineBreakIteratorPoolICU.h: * wtf/text/NullTextBreakIterator.h: * wtf/text/OrdinalNumber.h: * wtf/text/StringBuffer.h: * wtf/text/StringBuilder.h: * wtf/text/StringConcatenateNumbers.h: * wtf/text/StringHasher.h: * wtf/text/StringImpl.h: * wtf/text/StringView.cpp: * wtf/text/StringView.h: (WTF::StringView::left const): Deleted. (WTF::StringView::right const): Deleted. (WTF::StringView::underlyingStringIsValid const): Deleted. (WTF::StringView::setUnderlyingString): Deleted. * wtf/text/SymbolImpl.h: (WTF::SymbolImpl::StaticSymbolImpl::StaticSymbolImpl): Deleted. (WTF::SymbolImpl::StaticSymbolImpl::operator SymbolImpl&): Deleted. (WTF::PrivateSymbolImpl::PrivateSymbolImpl): Deleted. (WTF::RegisteredSymbolImpl::symbolRegistry const): Deleted. (WTF::RegisteredSymbolImpl::clearSymbolRegistry): Deleted. (WTF::RegisteredSymbolImpl::RegisteredSymbolImpl): Deleted. * wtf/text/SymbolRegistry.h: * wtf/text/TextBreakIterator.h: * wtf/text/TextPosition.h: * wtf/text/TextStream.h: * wtf/text/WTFString.h: (WTF::String::swap): Deleted. (WTF::String::adopt): Deleted. (WTF::String::isNull const): Deleted. (WTF::String::isEmpty const): Deleted. (WTF::String::impl const): Deleted. (WTF::String::releaseImpl): Deleted. (WTF::String::length const): Deleted. (WTF::String::characters8 const): Deleted. (WTF::String::characters16 const): Deleted. (WTF::String::is8Bit const): Deleted. (WTF::String::sizeInBytes const): Deleted. (WTF::String::operator[] const): Deleted. (WTF::String::find const): Deleted. (WTF::String::findIgnoringASCIICase const): Deleted. (WTF::String::reverseFind const): Deleted. (WTF::String::contains const): Deleted. (WTF::String::containsIgnoringASCIICase const): Deleted. (WTF::String::startsWith const): Deleted. (WTF::String::startsWithIgnoringASCIICase const): Deleted. (WTF::String::hasInfixStartingAt const): Deleted. (WTF::String::endsWith const): Deleted. (WTF::String::endsWithIgnoringASCIICase const): Deleted. (WTF::String::hasInfixEndingAt const): Deleted. (WTF::String::append): Deleted. (WTF::String::left const): Deleted. (WTF::String::right const): Deleted. (WTF::String::createUninitialized): Deleted. (WTF::String::fromUTF8WithLatin1Fallback): Deleted. (WTF::String::isAllASCII const): Deleted. (WTF::String::isAllLatin1 const): Deleted. (WTF::String::isSpecialCharacter const): Deleted. (WTF::String::isHashTableDeletedValue const): Deleted. (WTF::String::hash const): Deleted. (WTF::String::existingHash const): Deleted. * wtf/text/cf/TextBreakIteratorCF.h: * wtf/text/icu/TextBreakIteratorICU.h: * wtf/text/icu/UTextProviderLatin1.h: * wtf/threads/BinarySemaphore.h: (WTF::BinarySemaphore::waitFor): Deleted. (WTF::BinarySemaphore::wait): Deleted. * wtf/unicode/Collator.h: * wtf/win/GDIObject.h: * wtf/win/PathWalker.h: * wtf/win/Win32Handle.h: Canonical link: https://commits.webkit.org/214396@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248546 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-08-12 20:57:15 +00:00
WTF_MAKE_FAST_ALLOCATED;
public:
Failures from mach port reference handling should be fatal https://bugs.webkit.org/show_bug.cgi?id=184202 <rdar://problem/37771114> Reviewed by Anders Carlsson. Source/WebCore: We may corrupt the Mach port space by improperly matching the equivalent of reference counting retains (mach_port_mod_refs) with releases (mach_port_deallocate). Our current implementation of MachSendRights::create does not grab a reference if the passed port is MACH_PORT_DEAD, but we unconditionally call mach_port_deallocate on the port, which could lead to a reference count mismatch. Likewise, our MachSendRight destructor does not release the port if it has changed to MACH_PORT_DEAD (e.g., if a child process dies), again leading to a mismatch in retain/releases. Finally, failures in mach_port_deallocate should be fatal because they indicate that the application was attempting to remove an unowned right. This is a fatal condition for Mach, and should lead to an abort. This patch does the following: 1. It creates a helper function that does the right thing for safely deallocating a mach port. 2. It uses it in multiple places. 3. It revises 'MachSendRight::create" so that it properly handles the condition of a dead port. 4. It revises the MachSendRight destructor to properly handle the condition of a dead port. No new tests, no change in behavior expected. * SourcesCocoa.txt: Update for move of MachSendRight files. * WebCore.xcodeproj/project.pbxproj: Ditto. * page/cocoa/ResourceUsageThreadCocoa.mm: (WebCore::getMachThreads): Added. (WebCore::cpuUsage): Use the new cleanup helper function. * platform/cocoa/MachSendRight.cpp: Removed. * platform/cocoa/MachSendRight.h: Removed. * platform/graphics/avfoundation/objc/VideoFullscreenLayerManagerObjC.mm: (WebCore::VideoFullscreenLayerManagerObjC::setVideoFullscreenLayer): * platform/graphics/cocoa/IOSurface.h: * platform/graphics/cocoa/IOSurface.mm: Source/WebKit: Update for new location of MachSendRight.h. Switch to #pragma once in a few places. * Platform/IPC/mac/ConnectionMac.mm: (IPC::Connection::platformInvalidate): Adopt new 'safe mach_port_t deallocation' function. (IPC::Connection::initializeSendSource): Ditto. (IPC::Connection::receiveSourceEventHandler): Ditto. * Platform/SharedMemory.h: * Platform/cocoa/SharedMemoryCocoa.cpp: (WebKit::SharedMemory::Handle::clear): Ditto. (WebKit::makeMemoryEntry): Ditto. (WebKit::SharedMemory::createSendRight const): Ditto. * Platform/mac/LayerHostingContext.h: * Platform/mac/LayerHostingContext.mm: * PluginProcess/PluginControllerProxy.h: * PluginProcess/PluginProcess.h: (WebKit::PluginProcess::compositingRenderServerPort const): * Scripts/messages.py: (headers_for_type): Update for new location of MachSendRight. * Shared/Plugins/PluginProcessCreationParameters.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm: (WebKit::RemoteLayerBackingStore::encode const): * Shared/WebCoreArgumentCoders.h: * Shared/WebProcessCreationParameters.h: * Shared/mac/WebCoreArgumentCodersMac.mm: * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: * UIProcess/DrawingAreaProxy.cpp: * UIProcess/DrawingAreaProxy.h: * UIProcess/Launcher/mac/ProcessLauncherMac.mm: (WebKit::ProcessLauncher::launchProcess): Ditto. Remove uneeded mach_port_dealloc called after xpc_dictionary_set_mach_send. While '..._set_mach_send' retains the send right, it gets automatically released when the message is handled. We only want to manually deallocate the send right if the message failed to send. * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: * UIProcess/WebPageProxy.cpp: * UIProcess/WebPageProxy.h: * UIProcess/WebPageProxy.messages.in: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm: * UIProcess/mac/WKViewLayoutStrategy.mm: * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp: * WebProcess/Plugins/Netscape/NetscapePlugin.h: * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm: * WebProcess/Plugins/PluginController.h: * WebProcess/Plugins/PluginView.h: * WebProcess/WebPage/DrawingArea.h: (WebKit::DrawingArea::addFence): (WebKit::DrawingArea::updateGeometry): * WebProcess/WebPage/DrawingArea.messages.in: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::updateGeometry): * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::setTopContentInsetFenced): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::updateGeometry): * WebProcess/WebProcess.h: (WebKit::WebProcess::compositingRenderServerPort const): * WebProcess/cocoa/VideoFullscreenManager.mm: (WebKit::VideoFullscreenManager::setVideoLayerFrameFenced): Source/WebKitLegacy/mac: * Plugins/Hosted/NetscapePluginHostManager.mm: (WebKit::NetscapePluginHostManager::spawnPluginHost): Adopt new 'safe mach_port_t deallocation' function. Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/MachSendRight.h: Copied from WebCore/platform/cocoa/MachSendRight.h. (WebCore::MachSendRight::operator bool const): Deleted. (WebCore::MachSendRight::sendRight const): Deleted. * wtf/PlatformMac.cmake: * wtf/cocoa/CPUTimeCocoa.mm: (WTF::CPUTime::forCurrentThread): Do proper cleanup if the port is invalid. * wtf/cocoa/MachSendRight.cpp: Copied from WebCore/platform/cocoa/MachSendRight.cpp. (WTF::retainSendRight): (WTF::releaseSendRight): (WTF::deallocateSendRightSafely): (WebCore::retainSendRight): Deleted. (WebCore::releaseSendRight): Deleted. (WebCore::MachSendRight::adopt): Deleted. (WebCore::MachSendRight::create): Deleted. (WebCore::MachSendRight::MachSendRight): Deleted. (WebCore::MachSendRight::~MachSendRight): Deleted. (WebCore::MachSendRight::operator=): Deleted. (WebCore::MachSendRight::copySendRight const): Deleted. (WebCore::MachSendRight::leakSendRight): Deleted. Canonical link: https://commits.webkit.org/199860@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@230269 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-04-04 19:43:01 +00:00
WTF_EXPORT_PRIVATE static MachSendRight adopt(mach_port_t);
WTF_EXPORT_PRIVATE static MachSendRight create(mach_port_t);
MachSendRight() = default;
Prepare for memory ownership transfer in the GPUProcess https://bugs.webkit.org/show_bug.cgi?id=222122 Reviewed by Simon Fraser. Source/WebKit: Prepare for memory ownership transfer in the GPUProcess: 1. Have the WebProcess create a task identity token and pass it to the GPUProcess when connecting to it. The WebProcess' task identity token is then stored on the GPUConnectionToWebProcess object. 2. Add the entitlement to the GPUProcess that is needed to transfer memory ownership to another process. This is a first step towards having the GPUProcess transfer memory ownership of its IOSurfaces and Metal textures to the WebProcesses it is serving. * GPUProcess/GPUConnectionToWebProcess.cpp: (WebKit::GPUConnectionToWebProcess::create): (WebKit::GPUConnectionToWebProcess::GPUConnectionToWebProcess): * GPUProcess/GPUConnectionToWebProcess.h: (WebKit::GPUConnectionToWebProcess::webProcessIdentityToken const): * GPUProcess/GPUProcess.cpp: (WebKit::GPUProcess::createGPUConnectionToWebProcess): * GPUProcess/GPUProcess.h: * GPUProcess/GPUProcess.messages.in: * Scripts/process-entitlements.sh: * Shared/GPUProcessConnectionParameters.h: Copied from Source/WTF/wtf/MachSendRight.h. (WebKit::GPUProcessConnectionParameters::encode const): (WebKit::GPUProcessConnectionParameters::decode): * UIProcess/GPU/GPUProcessProxy.cpp: (WebKit::GPUProcessProxy::getGPUProcessConnection): * UIProcess/GPU/GPUProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::getGPUProcessConnection): * UIProcess/WebProcessPool.h: * UIProcess/WebProcessProxy.cpp: (WebKit::WebProcessProxy::getGPUProcessConnection): * UIProcess/WebProcessProxy.h: * UIProcess/WebProcessProxy.messages.in: * WebKit.xcodeproj/project.pbxproj: * WebProcess/WebProcess.cpp: (WebKit::WebProcess::platformInitializeGPUProcessConnectionParameters): (WebKit::WebProcess::getGPUProcessConnection): * WebProcess/WebProcess.h: * WebProcess/cocoa/WebProcessCocoa.mm: (WebKit::WebProcess::platformInitializeGPUProcessConnectionParameters): Source/WTF: * wtf/PlatformHave.h: Add feature flag for TASK_IDENTITY_TOKEN as this API was only introduced very recently. * wtf/MachSendRight.h: * wtf/cocoa/MachSendRight.cpp: (WTF::MachSendRight::MachSendRight): (WTF::MachSendRight::operator=): Add a copy constructor to MachSendRight for convenience. Canonical link: https://commits.webkit.org/234450@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@273288 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-02-23 00:31:56 +00:00
WTF_EXPORT_PRIVATE MachSendRight(const MachSendRight&);
Failures from mach port reference handling should be fatal https://bugs.webkit.org/show_bug.cgi?id=184202 <rdar://problem/37771114> Reviewed by Anders Carlsson. Source/WebCore: We may corrupt the Mach port space by improperly matching the equivalent of reference counting retains (mach_port_mod_refs) with releases (mach_port_deallocate). Our current implementation of MachSendRights::create does not grab a reference if the passed port is MACH_PORT_DEAD, but we unconditionally call mach_port_deallocate on the port, which could lead to a reference count mismatch. Likewise, our MachSendRight destructor does not release the port if it has changed to MACH_PORT_DEAD (e.g., if a child process dies), again leading to a mismatch in retain/releases. Finally, failures in mach_port_deallocate should be fatal because they indicate that the application was attempting to remove an unowned right. This is a fatal condition for Mach, and should lead to an abort. This patch does the following: 1. It creates a helper function that does the right thing for safely deallocating a mach port. 2. It uses it in multiple places. 3. It revises 'MachSendRight::create" so that it properly handles the condition of a dead port. 4. It revises the MachSendRight destructor to properly handle the condition of a dead port. No new tests, no change in behavior expected. * SourcesCocoa.txt: Update for move of MachSendRight files. * WebCore.xcodeproj/project.pbxproj: Ditto. * page/cocoa/ResourceUsageThreadCocoa.mm: (WebCore::getMachThreads): Added. (WebCore::cpuUsage): Use the new cleanup helper function. * platform/cocoa/MachSendRight.cpp: Removed. * platform/cocoa/MachSendRight.h: Removed. * platform/graphics/avfoundation/objc/VideoFullscreenLayerManagerObjC.mm: (WebCore::VideoFullscreenLayerManagerObjC::setVideoFullscreenLayer): * platform/graphics/cocoa/IOSurface.h: * platform/graphics/cocoa/IOSurface.mm: Source/WebKit: Update for new location of MachSendRight.h. Switch to #pragma once in a few places. * Platform/IPC/mac/ConnectionMac.mm: (IPC::Connection::platformInvalidate): Adopt new 'safe mach_port_t deallocation' function. (IPC::Connection::initializeSendSource): Ditto. (IPC::Connection::receiveSourceEventHandler): Ditto. * Platform/SharedMemory.h: * Platform/cocoa/SharedMemoryCocoa.cpp: (WebKit::SharedMemory::Handle::clear): Ditto. (WebKit::makeMemoryEntry): Ditto. (WebKit::SharedMemory::createSendRight const): Ditto. * Platform/mac/LayerHostingContext.h: * Platform/mac/LayerHostingContext.mm: * PluginProcess/PluginControllerProxy.h: * PluginProcess/PluginProcess.h: (WebKit::PluginProcess::compositingRenderServerPort const): * Scripts/messages.py: (headers_for_type): Update for new location of MachSendRight. * Shared/Plugins/PluginProcessCreationParameters.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm: (WebKit::RemoteLayerBackingStore::encode const): * Shared/WebCoreArgumentCoders.h: * Shared/WebProcessCreationParameters.h: * Shared/mac/WebCoreArgumentCodersMac.mm: * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: * UIProcess/DrawingAreaProxy.cpp: * UIProcess/DrawingAreaProxy.h: * UIProcess/Launcher/mac/ProcessLauncherMac.mm: (WebKit::ProcessLauncher::launchProcess): Ditto. Remove uneeded mach_port_dealloc called after xpc_dictionary_set_mach_send. While '..._set_mach_send' retains the send right, it gets automatically released when the message is handled. We only want to manually deallocate the send right if the message failed to send. * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: * UIProcess/WebPageProxy.cpp: * UIProcess/WebPageProxy.h: * UIProcess/WebPageProxy.messages.in: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm: * UIProcess/mac/WKViewLayoutStrategy.mm: * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp: * WebProcess/Plugins/Netscape/NetscapePlugin.h: * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm: * WebProcess/Plugins/PluginController.h: * WebProcess/Plugins/PluginView.h: * WebProcess/WebPage/DrawingArea.h: (WebKit::DrawingArea::addFence): (WebKit::DrawingArea::updateGeometry): * WebProcess/WebPage/DrawingArea.messages.in: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::updateGeometry): * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::setTopContentInsetFenced): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::updateGeometry): * WebProcess/WebProcess.h: (WebKit::WebProcess::compositingRenderServerPort const): * WebProcess/cocoa/VideoFullscreenManager.mm: (WebKit::VideoFullscreenManager::setVideoLayerFrameFenced): Source/WebKitLegacy/mac: * Plugins/Hosted/NetscapePluginHostManager.mm: (WebKit::NetscapePluginHostManager::spawnPluginHost): Adopt new 'safe mach_port_t deallocation' function. Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/MachSendRight.h: Copied from WebCore/platform/cocoa/MachSendRight.h. (WebCore::MachSendRight::operator bool const): Deleted. (WebCore::MachSendRight::sendRight const): Deleted. * wtf/PlatformMac.cmake: * wtf/cocoa/CPUTimeCocoa.mm: (WTF::CPUTime::forCurrentThread): Do proper cleanup if the port is invalid. * wtf/cocoa/MachSendRight.cpp: Copied from WebCore/platform/cocoa/MachSendRight.cpp. (WTF::retainSendRight): (WTF::releaseSendRight): (WTF::deallocateSendRightSafely): (WebCore::retainSendRight): Deleted. (WebCore::releaseSendRight): Deleted. (WebCore::MachSendRight::adopt): Deleted. (WebCore::MachSendRight::create): Deleted. (WebCore::MachSendRight::MachSendRight): Deleted. (WebCore::MachSendRight::~MachSendRight): Deleted. (WebCore::MachSendRight::operator=): Deleted. (WebCore::MachSendRight::copySendRight const): Deleted. (WebCore::MachSendRight::leakSendRight): Deleted. Canonical link: https://commits.webkit.org/199860@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@230269 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-04-04 19:43:01 +00:00
WTF_EXPORT_PRIVATE MachSendRight(MachSendRight&&);
WTF_EXPORT_PRIVATE ~MachSendRight();
Prepare for memory ownership transfer in the GPUProcess https://bugs.webkit.org/show_bug.cgi?id=222122 Reviewed by Simon Fraser. Source/WebKit: Prepare for memory ownership transfer in the GPUProcess: 1. Have the WebProcess create a task identity token and pass it to the GPUProcess when connecting to it. The WebProcess' task identity token is then stored on the GPUConnectionToWebProcess object. 2. Add the entitlement to the GPUProcess that is needed to transfer memory ownership to another process. This is a first step towards having the GPUProcess transfer memory ownership of its IOSurfaces and Metal textures to the WebProcesses it is serving. * GPUProcess/GPUConnectionToWebProcess.cpp: (WebKit::GPUConnectionToWebProcess::create): (WebKit::GPUConnectionToWebProcess::GPUConnectionToWebProcess): * GPUProcess/GPUConnectionToWebProcess.h: (WebKit::GPUConnectionToWebProcess::webProcessIdentityToken const): * GPUProcess/GPUProcess.cpp: (WebKit::GPUProcess::createGPUConnectionToWebProcess): * GPUProcess/GPUProcess.h: * GPUProcess/GPUProcess.messages.in: * Scripts/process-entitlements.sh: * Shared/GPUProcessConnectionParameters.h: Copied from Source/WTF/wtf/MachSendRight.h. (WebKit::GPUProcessConnectionParameters::encode const): (WebKit::GPUProcessConnectionParameters::decode): * UIProcess/GPU/GPUProcessProxy.cpp: (WebKit::GPUProcessProxy::getGPUProcessConnection): * UIProcess/GPU/GPUProcessProxy.h: * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::getGPUProcessConnection): * UIProcess/WebProcessPool.h: * UIProcess/WebProcessProxy.cpp: (WebKit::WebProcessProxy::getGPUProcessConnection): * UIProcess/WebProcessProxy.h: * UIProcess/WebProcessProxy.messages.in: * WebKit.xcodeproj/project.pbxproj: * WebProcess/WebProcess.cpp: (WebKit::WebProcess::platformInitializeGPUProcessConnectionParameters): (WebKit::WebProcess::getGPUProcessConnection): * WebProcess/WebProcess.h: * WebProcess/cocoa/WebProcessCocoa.mm: (WebKit::WebProcess::platformInitializeGPUProcessConnectionParameters): Source/WTF: * wtf/PlatformHave.h: Add feature flag for TASK_IDENTITY_TOKEN as this API was only introduced very recently. * wtf/MachSendRight.h: * wtf/cocoa/MachSendRight.cpp: (WTF::MachSendRight::MachSendRight): (WTF::MachSendRight::operator=): Add a copy constructor to MachSendRight for convenience. Canonical link: https://commits.webkit.org/234450@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@273288 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-02-23 00:31:56 +00:00
WTF_EXPORT_PRIVATE MachSendRight& operator=(const MachSendRight&);
Failures from mach port reference handling should be fatal https://bugs.webkit.org/show_bug.cgi?id=184202 <rdar://problem/37771114> Reviewed by Anders Carlsson. Source/WebCore: We may corrupt the Mach port space by improperly matching the equivalent of reference counting retains (mach_port_mod_refs) with releases (mach_port_deallocate). Our current implementation of MachSendRights::create does not grab a reference if the passed port is MACH_PORT_DEAD, but we unconditionally call mach_port_deallocate on the port, which could lead to a reference count mismatch. Likewise, our MachSendRight destructor does not release the port if it has changed to MACH_PORT_DEAD (e.g., if a child process dies), again leading to a mismatch in retain/releases. Finally, failures in mach_port_deallocate should be fatal because they indicate that the application was attempting to remove an unowned right. This is a fatal condition for Mach, and should lead to an abort. This patch does the following: 1. It creates a helper function that does the right thing for safely deallocating a mach port. 2. It uses it in multiple places. 3. It revises 'MachSendRight::create" so that it properly handles the condition of a dead port. 4. It revises the MachSendRight destructor to properly handle the condition of a dead port. No new tests, no change in behavior expected. * SourcesCocoa.txt: Update for move of MachSendRight files. * WebCore.xcodeproj/project.pbxproj: Ditto. * page/cocoa/ResourceUsageThreadCocoa.mm: (WebCore::getMachThreads): Added. (WebCore::cpuUsage): Use the new cleanup helper function. * platform/cocoa/MachSendRight.cpp: Removed. * platform/cocoa/MachSendRight.h: Removed. * platform/graphics/avfoundation/objc/VideoFullscreenLayerManagerObjC.mm: (WebCore::VideoFullscreenLayerManagerObjC::setVideoFullscreenLayer): * platform/graphics/cocoa/IOSurface.h: * platform/graphics/cocoa/IOSurface.mm: Source/WebKit: Update for new location of MachSendRight.h. Switch to #pragma once in a few places. * Platform/IPC/mac/ConnectionMac.mm: (IPC::Connection::platformInvalidate): Adopt new 'safe mach_port_t deallocation' function. (IPC::Connection::initializeSendSource): Ditto. (IPC::Connection::receiveSourceEventHandler): Ditto. * Platform/SharedMemory.h: * Platform/cocoa/SharedMemoryCocoa.cpp: (WebKit::SharedMemory::Handle::clear): Ditto. (WebKit::makeMemoryEntry): Ditto. (WebKit::SharedMemory::createSendRight const): Ditto. * Platform/mac/LayerHostingContext.h: * Platform/mac/LayerHostingContext.mm: * PluginProcess/PluginControllerProxy.h: * PluginProcess/PluginProcess.h: (WebKit::PluginProcess::compositingRenderServerPort const): * Scripts/messages.py: (headers_for_type): Update for new location of MachSendRight. * Shared/Plugins/PluginProcessCreationParameters.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm: (WebKit::RemoteLayerBackingStore::encode const): * Shared/WebCoreArgumentCoders.h: * Shared/WebProcessCreationParameters.h: * Shared/mac/WebCoreArgumentCodersMac.mm: * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: * UIProcess/DrawingAreaProxy.cpp: * UIProcess/DrawingAreaProxy.h: * UIProcess/Launcher/mac/ProcessLauncherMac.mm: (WebKit::ProcessLauncher::launchProcess): Ditto. Remove uneeded mach_port_dealloc called after xpc_dictionary_set_mach_send. While '..._set_mach_send' retains the send right, it gets automatically released when the message is handled. We only want to manually deallocate the send right if the message failed to send. * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: * UIProcess/WebPageProxy.cpp: * UIProcess/WebPageProxy.h: * UIProcess/WebPageProxy.messages.in: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm: * UIProcess/mac/WKViewLayoutStrategy.mm: * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp: * WebProcess/Plugins/Netscape/NetscapePlugin.h: * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm: * WebProcess/Plugins/PluginController.h: * WebProcess/Plugins/PluginView.h: * WebProcess/WebPage/DrawingArea.h: (WebKit::DrawingArea::addFence): (WebKit::DrawingArea::updateGeometry): * WebProcess/WebPage/DrawingArea.messages.in: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::updateGeometry): * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::setTopContentInsetFenced): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::updateGeometry): * WebProcess/WebProcess.h: (WebKit::WebProcess::compositingRenderServerPort const): * WebProcess/cocoa/VideoFullscreenManager.mm: (WebKit::VideoFullscreenManager::setVideoLayerFrameFenced): Source/WebKitLegacy/mac: * Plugins/Hosted/NetscapePluginHostManager.mm: (WebKit::NetscapePluginHostManager::spawnPluginHost): Adopt new 'safe mach_port_t deallocation' function. Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/MachSendRight.h: Copied from WebCore/platform/cocoa/MachSendRight.h. (WebCore::MachSendRight::operator bool const): Deleted. (WebCore::MachSendRight::sendRight const): Deleted. * wtf/PlatformMac.cmake: * wtf/cocoa/CPUTimeCocoa.mm: (WTF::CPUTime::forCurrentThread): Do proper cleanup if the port is invalid. * wtf/cocoa/MachSendRight.cpp: Copied from WebCore/platform/cocoa/MachSendRight.cpp. (WTF::retainSendRight): (WTF::releaseSendRight): (WTF::deallocateSendRightSafely): (WebCore::retainSendRight): Deleted. (WebCore::releaseSendRight): Deleted. (WebCore::MachSendRight::adopt): Deleted. (WebCore::MachSendRight::create): Deleted. (WebCore::MachSendRight::MachSendRight): Deleted. (WebCore::MachSendRight::~MachSendRight): Deleted. (WebCore::MachSendRight::operator=): Deleted. (WebCore::MachSendRight::copySendRight const): Deleted. (WebCore::MachSendRight::leakSendRight): Deleted. Canonical link: https://commits.webkit.org/199860@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@230269 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-04-04 19:43:01 +00:00
WTF_EXPORT_PRIVATE MachSendRight& operator=(MachSendRight&&);
explicit operator bool() const { return m_port != MACH_PORT_NULL; }
mach_port_t sendRight() const { return m_port; }
Failures from mach port reference handling should be fatal https://bugs.webkit.org/show_bug.cgi?id=184202 <rdar://problem/37771114> Reviewed by Anders Carlsson. Source/WebCore: We may corrupt the Mach port space by improperly matching the equivalent of reference counting retains (mach_port_mod_refs) with releases (mach_port_deallocate). Our current implementation of MachSendRights::create does not grab a reference if the passed port is MACH_PORT_DEAD, but we unconditionally call mach_port_deallocate on the port, which could lead to a reference count mismatch. Likewise, our MachSendRight destructor does not release the port if it has changed to MACH_PORT_DEAD (e.g., if a child process dies), again leading to a mismatch in retain/releases. Finally, failures in mach_port_deallocate should be fatal because they indicate that the application was attempting to remove an unowned right. This is a fatal condition for Mach, and should lead to an abort. This patch does the following: 1. It creates a helper function that does the right thing for safely deallocating a mach port. 2. It uses it in multiple places. 3. It revises 'MachSendRight::create" so that it properly handles the condition of a dead port. 4. It revises the MachSendRight destructor to properly handle the condition of a dead port. No new tests, no change in behavior expected. * SourcesCocoa.txt: Update for move of MachSendRight files. * WebCore.xcodeproj/project.pbxproj: Ditto. * page/cocoa/ResourceUsageThreadCocoa.mm: (WebCore::getMachThreads): Added. (WebCore::cpuUsage): Use the new cleanup helper function. * platform/cocoa/MachSendRight.cpp: Removed. * platform/cocoa/MachSendRight.h: Removed. * platform/graphics/avfoundation/objc/VideoFullscreenLayerManagerObjC.mm: (WebCore::VideoFullscreenLayerManagerObjC::setVideoFullscreenLayer): * platform/graphics/cocoa/IOSurface.h: * platform/graphics/cocoa/IOSurface.mm: Source/WebKit: Update for new location of MachSendRight.h. Switch to #pragma once in a few places. * Platform/IPC/mac/ConnectionMac.mm: (IPC::Connection::platformInvalidate): Adopt new 'safe mach_port_t deallocation' function. (IPC::Connection::initializeSendSource): Ditto. (IPC::Connection::receiveSourceEventHandler): Ditto. * Platform/SharedMemory.h: * Platform/cocoa/SharedMemoryCocoa.cpp: (WebKit::SharedMemory::Handle::clear): Ditto. (WebKit::makeMemoryEntry): Ditto. (WebKit::SharedMemory::createSendRight const): Ditto. * Platform/mac/LayerHostingContext.h: * Platform/mac/LayerHostingContext.mm: * PluginProcess/PluginControllerProxy.h: * PluginProcess/PluginProcess.h: (WebKit::PluginProcess::compositingRenderServerPort const): * Scripts/messages.py: (headers_for_type): Update for new location of MachSendRight. * Shared/Plugins/PluginProcessCreationParameters.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm: (WebKit::RemoteLayerBackingStore::encode const): * Shared/WebCoreArgumentCoders.h: * Shared/WebProcessCreationParameters.h: * Shared/mac/WebCoreArgumentCodersMac.mm: * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: * UIProcess/DrawingAreaProxy.cpp: * UIProcess/DrawingAreaProxy.h: * UIProcess/Launcher/mac/ProcessLauncherMac.mm: (WebKit::ProcessLauncher::launchProcess): Ditto. Remove uneeded mach_port_dealloc called after xpc_dictionary_set_mach_send. While '..._set_mach_send' retains the send right, it gets automatically released when the message is handled. We only want to manually deallocate the send right if the message failed to send. * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: * UIProcess/WebPageProxy.cpp: * UIProcess/WebPageProxy.h: * UIProcess/WebPageProxy.messages.in: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm: * UIProcess/mac/WKViewLayoutStrategy.mm: * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp: * WebProcess/Plugins/Netscape/NetscapePlugin.h: * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm: * WebProcess/Plugins/PluginController.h: * WebProcess/Plugins/PluginView.h: * WebProcess/WebPage/DrawingArea.h: (WebKit::DrawingArea::addFence): (WebKit::DrawingArea::updateGeometry): * WebProcess/WebPage/DrawingArea.messages.in: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::updateGeometry): * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::setTopContentInsetFenced): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::updateGeometry): * WebProcess/WebProcess.h: (WebKit::WebProcess::compositingRenderServerPort const): * WebProcess/cocoa/VideoFullscreenManager.mm: (WebKit::VideoFullscreenManager::setVideoLayerFrameFenced): Source/WebKitLegacy/mac: * Plugins/Hosted/NetscapePluginHostManager.mm: (WebKit::NetscapePluginHostManager::spawnPluginHost): Adopt new 'safe mach_port_t deallocation' function. Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/MachSendRight.h: Copied from WebCore/platform/cocoa/MachSendRight.h. (WebCore::MachSendRight::operator bool const): Deleted. (WebCore::MachSendRight::sendRight const): Deleted. * wtf/PlatformMac.cmake: * wtf/cocoa/CPUTimeCocoa.mm: (WTF::CPUTime::forCurrentThread): Do proper cleanup if the port is invalid. * wtf/cocoa/MachSendRight.cpp: Copied from WebCore/platform/cocoa/MachSendRight.cpp. (WTF::retainSendRight): (WTF::releaseSendRight): (WTF::deallocateSendRightSafely): (WebCore::retainSendRight): Deleted. (WebCore::releaseSendRight): Deleted. (WebCore::MachSendRight::adopt): Deleted. (WebCore::MachSendRight::create): Deleted. (WebCore::MachSendRight::MachSendRight): Deleted. (WebCore::MachSendRight::~MachSendRight): Deleted. (WebCore::MachSendRight::operator=): Deleted. (WebCore::MachSendRight::copySendRight const): Deleted. (WebCore::MachSendRight::leakSendRight): Deleted. Canonical link: https://commits.webkit.org/199860@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@230269 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-04-04 19:43:01 +00:00
WTF_EXPORT_PRIVATE MachSendRight copySendRight() const;
WTF_EXPORT_PRIVATE mach_port_t leakSendRight() WARN_UNUSED_RETURN;
private:
explicit MachSendRight(mach_port_t);
mach_port_t m_port { MACH_PORT_NULL };
};
Failures from mach port reference handling should be fatal https://bugs.webkit.org/show_bug.cgi?id=184202 <rdar://problem/37771114> Reviewed by Anders Carlsson. Source/WebCore: We may corrupt the Mach port space by improperly matching the equivalent of reference counting retains (mach_port_mod_refs) with releases (mach_port_deallocate). Our current implementation of MachSendRights::create does not grab a reference if the passed port is MACH_PORT_DEAD, but we unconditionally call mach_port_deallocate on the port, which could lead to a reference count mismatch. Likewise, our MachSendRight destructor does not release the port if it has changed to MACH_PORT_DEAD (e.g., if a child process dies), again leading to a mismatch in retain/releases. Finally, failures in mach_port_deallocate should be fatal because they indicate that the application was attempting to remove an unowned right. This is a fatal condition for Mach, and should lead to an abort. This patch does the following: 1. It creates a helper function that does the right thing for safely deallocating a mach port. 2. It uses it in multiple places. 3. It revises 'MachSendRight::create" so that it properly handles the condition of a dead port. 4. It revises the MachSendRight destructor to properly handle the condition of a dead port. No new tests, no change in behavior expected. * SourcesCocoa.txt: Update for move of MachSendRight files. * WebCore.xcodeproj/project.pbxproj: Ditto. * page/cocoa/ResourceUsageThreadCocoa.mm: (WebCore::getMachThreads): Added. (WebCore::cpuUsage): Use the new cleanup helper function. * platform/cocoa/MachSendRight.cpp: Removed. * platform/cocoa/MachSendRight.h: Removed. * platform/graphics/avfoundation/objc/VideoFullscreenLayerManagerObjC.mm: (WebCore::VideoFullscreenLayerManagerObjC::setVideoFullscreenLayer): * platform/graphics/cocoa/IOSurface.h: * platform/graphics/cocoa/IOSurface.mm: Source/WebKit: Update for new location of MachSendRight.h. Switch to #pragma once in a few places. * Platform/IPC/mac/ConnectionMac.mm: (IPC::Connection::platformInvalidate): Adopt new 'safe mach_port_t deallocation' function. (IPC::Connection::initializeSendSource): Ditto. (IPC::Connection::receiveSourceEventHandler): Ditto. * Platform/SharedMemory.h: * Platform/cocoa/SharedMemoryCocoa.cpp: (WebKit::SharedMemory::Handle::clear): Ditto. (WebKit::makeMemoryEntry): Ditto. (WebKit::SharedMemory::createSendRight const): Ditto. * Platform/mac/LayerHostingContext.h: * Platform/mac/LayerHostingContext.mm: * PluginProcess/PluginControllerProxy.h: * PluginProcess/PluginProcess.h: (WebKit::PluginProcess::compositingRenderServerPort const): * Scripts/messages.py: (headers_for_type): Update for new location of MachSendRight. * Shared/Plugins/PluginProcessCreationParameters.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm: (WebKit::RemoteLayerBackingStore::encode const): * Shared/WebCoreArgumentCoders.h: * Shared/WebProcessCreationParameters.h: * Shared/mac/WebCoreArgumentCodersMac.mm: * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: * UIProcess/DrawingAreaProxy.cpp: * UIProcess/DrawingAreaProxy.h: * UIProcess/Launcher/mac/ProcessLauncherMac.mm: (WebKit::ProcessLauncher::launchProcess): Ditto. Remove uneeded mach_port_dealloc called after xpc_dictionary_set_mach_send. While '..._set_mach_send' retains the send right, it gets automatically released when the message is handled. We only want to manually deallocate the send right if the message failed to send. * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: * UIProcess/WebPageProxy.cpp: * UIProcess/WebPageProxy.h: * UIProcess/WebPageProxy.messages.in: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm: * UIProcess/mac/WKViewLayoutStrategy.mm: * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp: * WebProcess/Plugins/Netscape/NetscapePlugin.h: * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm: * WebProcess/Plugins/PluginController.h: * WebProcess/Plugins/PluginView.h: * WebProcess/WebPage/DrawingArea.h: (WebKit::DrawingArea::addFence): (WebKit::DrawingArea::updateGeometry): * WebProcess/WebPage/DrawingArea.messages.in: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::updateGeometry): * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::setTopContentInsetFenced): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::updateGeometry): * WebProcess/WebProcess.h: (WebKit::WebProcess::compositingRenderServerPort const): * WebProcess/cocoa/VideoFullscreenManager.mm: (WebKit::VideoFullscreenManager::setVideoLayerFrameFenced): Source/WebKitLegacy/mac: * Plugins/Hosted/NetscapePluginHostManager.mm: (WebKit::NetscapePluginHostManager::spawnPluginHost): Adopt new 'safe mach_port_t deallocation' function. Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/MachSendRight.h: Copied from WebCore/platform/cocoa/MachSendRight.h. (WebCore::MachSendRight::operator bool const): Deleted. (WebCore::MachSendRight::sendRight const): Deleted. * wtf/PlatformMac.cmake: * wtf/cocoa/CPUTimeCocoa.mm: (WTF::CPUTime::forCurrentThread): Do proper cleanup if the port is invalid. * wtf/cocoa/MachSendRight.cpp: Copied from WebCore/platform/cocoa/MachSendRight.cpp. (WTF::retainSendRight): (WTF::releaseSendRight): (WTF::deallocateSendRightSafely): (WebCore::retainSendRight): Deleted. (WebCore::releaseSendRight): Deleted. (WebCore::MachSendRight::adopt): Deleted. (WebCore::MachSendRight::create): Deleted. (WebCore::MachSendRight::MachSendRight): Deleted. (WebCore::MachSendRight::~MachSendRight): Deleted. (WebCore::MachSendRight::operator=): Deleted. (WebCore::MachSendRight::copySendRight const): Deleted. (WebCore::MachSendRight::leakSendRight): Deleted. Canonical link: https://commits.webkit.org/199860@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@230269 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-04-04 19:43:01 +00:00
WTF_EXPORT_PRIVATE void deallocateSendRightSafely(mach_port_t);
}
Failures from mach port reference handling should be fatal https://bugs.webkit.org/show_bug.cgi?id=184202 <rdar://problem/37771114> Reviewed by Anders Carlsson. Source/WebCore: We may corrupt the Mach port space by improperly matching the equivalent of reference counting retains (mach_port_mod_refs) with releases (mach_port_deallocate). Our current implementation of MachSendRights::create does not grab a reference if the passed port is MACH_PORT_DEAD, but we unconditionally call mach_port_deallocate on the port, which could lead to a reference count mismatch. Likewise, our MachSendRight destructor does not release the port if it has changed to MACH_PORT_DEAD (e.g., if a child process dies), again leading to a mismatch in retain/releases. Finally, failures in mach_port_deallocate should be fatal because they indicate that the application was attempting to remove an unowned right. This is a fatal condition for Mach, and should lead to an abort. This patch does the following: 1. It creates a helper function that does the right thing for safely deallocating a mach port. 2. It uses it in multiple places. 3. It revises 'MachSendRight::create" so that it properly handles the condition of a dead port. 4. It revises the MachSendRight destructor to properly handle the condition of a dead port. No new tests, no change in behavior expected. * SourcesCocoa.txt: Update for move of MachSendRight files. * WebCore.xcodeproj/project.pbxproj: Ditto. * page/cocoa/ResourceUsageThreadCocoa.mm: (WebCore::getMachThreads): Added. (WebCore::cpuUsage): Use the new cleanup helper function. * platform/cocoa/MachSendRight.cpp: Removed. * platform/cocoa/MachSendRight.h: Removed. * platform/graphics/avfoundation/objc/VideoFullscreenLayerManagerObjC.mm: (WebCore::VideoFullscreenLayerManagerObjC::setVideoFullscreenLayer): * platform/graphics/cocoa/IOSurface.h: * platform/graphics/cocoa/IOSurface.mm: Source/WebKit: Update for new location of MachSendRight.h. Switch to #pragma once in a few places. * Platform/IPC/mac/ConnectionMac.mm: (IPC::Connection::platformInvalidate): Adopt new 'safe mach_port_t deallocation' function. (IPC::Connection::initializeSendSource): Ditto. (IPC::Connection::receiveSourceEventHandler): Ditto. * Platform/SharedMemory.h: * Platform/cocoa/SharedMemoryCocoa.cpp: (WebKit::SharedMemory::Handle::clear): Ditto. (WebKit::makeMemoryEntry): Ditto. (WebKit::SharedMemory::createSendRight const): Ditto. * Platform/mac/LayerHostingContext.h: * Platform/mac/LayerHostingContext.mm: * PluginProcess/PluginControllerProxy.h: * PluginProcess/PluginProcess.h: (WebKit::PluginProcess::compositingRenderServerPort const): * Scripts/messages.py: (headers_for_type): Update for new location of MachSendRight. * Shared/Plugins/PluginProcessCreationParameters.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.h: * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm: (WebKit::RemoteLayerBackingStore::encode const): * Shared/WebCoreArgumentCoders.h: * Shared/WebProcessCreationParameters.h: * Shared/mac/WebCoreArgumentCodersMac.mm: * UIProcess/Cocoa/VideoFullscreenManagerProxy.mm: * UIProcess/DrawingAreaProxy.cpp: * UIProcess/DrawingAreaProxy.h: * UIProcess/Launcher/mac/ProcessLauncherMac.mm: (WebKit::ProcessLauncher::launchProcess): Ditto. Remove uneeded mach_port_dealloc called after xpc_dictionary_set_mach_send. While '..._set_mach_send' retains the send right, it gets automatically released when the message is handled. We only want to manually deallocate the send right if the message failed to send. * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: * UIProcess/WebPageProxy.cpp: * UIProcess/WebPageProxy.h: * UIProcess/WebPageProxy.messages.in: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.h: * UIProcess/mac/TiledCoreAnimationDrawingAreaProxy.mm: * UIProcess/mac/WKViewLayoutStrategy.mm: * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp: * WebProcess/Plugins/Netscape/NetscapePlugin.h: * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm: * WebProcess/Plugins/PluginController.h: * WebProcess/Plugins/PluginView.h: * WebProcess/WebPage/DrawingArea.h: (WebKit::DrawingArea::addFence): (WebKit::DrawingArea::updateGeometry): * WebProcess/WebPage/DrawingArea.messages.in: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::updateGeometry): * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::setTopContentInsetFenced): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::updateGeometry): * WebProcess/WebProcess.h: (WebKit::WebProcess::compositingRenderServerPort const): * WebProcess/cocoa/VideoFullscreenManager.mm: (WebKit::VideoFullscreenManager::setVideoLayerFrameFenced): Source/WebKitLegacy/mac: * Plugins/Hosted/NetscapePluginHostManager.mm: (WebKit::NetscapePluginHostManager::spawnPluginHost): Adopt new 'safe mach_port_t deallocation' function. Source/WTF: * WTF.xcodeproj/project.pbxproj: * wtf/MachSendRight.h: Copied from WebCore/platform/cocoa/MachSendRight.h. (WebCore::MachSendRight::operator bool const): Deleted. (WebCore::MachSendRight::sendRight const): Deleted. * wtf/PlatformMac.cmake: * wtf/cocoa/CPUTimeCocoa.mm: (WTF::CPUTime::forCurrentThread): Do proper cleanup if the port is invalid. * wtf/cocoa/MachSendRight.cpp: Copied from WebCore/platform/cocoa/MachSendRight.cpp. (WTF::retainSendRight): (WTF::releaseSendRight): (WTF::deallocateSendRightSafely): (WebCore::retainSendRight): Deleted. (WebCore::releaseSendRight): Deleted. (WebCore::MachSendRight::adopt): Deleted. (WebCore::MachSendRight::create): Deleted. (WebCore::MachSendRight::MachSendRight): Deleted. (WebCore::MachSendRight::~MachSendRight): Deleted. (WebCore::MachSendRight::operator=): Deleted. (WebCore::MachSendRight::copySendRight const): Deleted. (WebCore::MachSendRight::leakSendRight): Deleted. Canonical link: https://commits.webkit.org/199860@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@230269 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-04-04 19:43:01 +00:00
using WTF::MachSendRight;
using WTF::deallocateSendRightSafely;
#endif