Title: [294784] trunk/Source/WebKit
Revision
294784
Author
[email protected]
Date
2022-05-24 19:12:52 -0700 (Tue, 24 May 2022)

Log Message

Reduce refcount of SharedMemory when sending them over IPC.
https://bugs.webkit.org/show_bug.cgi?id=240855
rdar://problem/93806688

Reviewed by Jer Noble.

In the future, we want to be able to donate memory with exclusive access to another process, this require the VM to have a refcount of 1.
No change in obeservable behaviour. Covered by existing tests.

* Source/WebKit/Shared/WebCoreArgumentCoders.cpp:
(IPC::encodeSharedBuffer):
* Source/WebKit/UIProcess/Cocoa/WebPasteboardProxyCocoa.mm:
(WebKit::WebPasteboardProxy::getPasteboardBufferForType):
(WebKit::WebPasteboardProxy::readBufferFromPasteboard):
* Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp:
(WebKit::RemoteMediaResourceProxy::dataReceived):
* Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp:
(WebKit::SourceBufferPrivateRemote::append):
* Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.mm:
(WebKit::PDFPlugin::writeItemsToPasteboard):
* Source/WebKit/WebProcess/WebCoreSupport/mac/WebDragClientMac.mm:
(WebKit::WebDragClient::declareAndWriteDragImage):
* Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::performActionOnElement):
(WebKit::WebPage::didFinishLoadForQuickLookDocumentInMainFrame):
* Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm:
(WebKit::WebPage::getDataSelectionForPasteboard):

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

Modified Paths

Diff

Modified: trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp (294783 => 294784)


--- trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp	2022-05-25 01:43:45 UTC (rev 294783)
+++ trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp	2022-05-25 02:12:52 UTC (rev 294784)
@@ -188,8 +188,10 @@
         encoder.encodeFixedLengthData(element.segment->data(), element.segment->size(), 1);
 #else
     SharedMemory::Handle handle;
-    auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
-    sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly);
+    {
+        auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
+        sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly);
+    }
     encoder << SharedMemory::IPCHandle { WTFMove(handle), bufferSize };
 #endif
 }

Modified: trunk/Source/WebKit/UIProcess/Cocoa/WebPasteboardProxyCocoa.mm (294783 => 294784)


--- trunk/Source/WebKit/UIProcess/Cocoa/WebPasteboardProxyCocoa.mm	2022-05-25 01:43:45 UTC (rev 294783)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WebPasteboardProxyCocoa.mm	2022-05-25 02:12:52 UTC (rev 294784)
@@ -232,12 +232,14 @@
         uint64_t size = buffer->size();
         if (!size)
             return completionHandler({ });
-        auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
-        if (!sharedMemoryBuffer)
-            return completionHandler({ });
         SharedMemory::Handle handle;
-        if (!sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly))
-            return completionHandler({ });
+        {
+            auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
+            if (!sharedMemoryBuffer)
+                return completionHandler({ });
+            if (!sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly))
+                return completionHandler({ });
+        }
         completionHandler(SharedMemory::IPCHandle { WTFMove(handle), size });
     });
 }
@@ -554,12 +556,14 @@
         uint64_t size = buffer->size();
         if (!size)
             return completionHandler({ });
-        auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
-        if (!sharedMemoryBuffer)
-            return completionHandler({ });
         SharedMemory::Handle handle;
-        if (!sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly))
-            return completionHandler({ });
+        {
+            auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
+            if (!sharedMemoryBuffer)
+                return completionHandler({ });
+            if (!sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly))
+                return completionHandler({ });
+        }
         completionHandler(SharedMemory::IPCHandle { WTFMove(handle), size });
     });
 }

Modified: trunk/Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp (294783 => 294784)


--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp	2022-05-25 01:43:45 UTC (rev 294783)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp	2022-05-25 02:12:52 UTC (rev 294784)
@@ -74,12 +74,13 @@
 
 void RemoteMediaResourceProxy::dataReceived(WebCore::PlatformMediaResource&, const WebCore::SharedBuffer& buffer)
 {
-    auto sharedMemory = SharedMemory::copyBuffer(buffer);
-    if (!sharedMemory)
-        return;
-
     SharedMemory::Handle handle;
-    sharedMemory->createHandle(handle, SharedMemory::Protection::ReadOnly);
+    {
+        auto sharedMemory = SharedMemory::copyBuffer(buffer);
+        if (!sharedMemory)
+            return;
+        sharedMemory->createHandle(handle, SharedMemory::Protection::ReadOnly);
+    }
     // Take ownership of shared memory and mark it as media-related memory.
     handle.takeOwnershipOfMemory(MemoryLedger::Media);
     m_connection->send(Messages::RemoteMediaResourceManager::DataReceived(m_id, SharedMemory::IPCHandle { WTFMove(handle), buffer.size() }), 0);

Modified: trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp (294783 => 294784)


--- trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp	2022-05-25 01:43:45 UTC (rev 294783)
+++ trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp	2022-05-25 02:12:52 UTC (rev 294784)
@@ -83,14 +83,17 @@
     if (!m_gpuProcessConnection)
         return;
 
-    auto sharedData = SharedMemory::copyBuffer(data);
     SharedMemory::Handle handle;
-    sharedData->createHandle(handle, SharedMemory::Protection::ReadOnly);
-
+    {
+        auto sharedData = SharedMemory::copyBuffer(data);
+        if (!sharedData)
+            return;
+        sharedData->createHandle(handle, SharedMemory::Protection::ReadOnly);
+    }
     // Take ownership of shared memory and mark it as media-related memory.
     handle.takeOwnershipOfMemory(MemoryLedger::Media);
 
-    m_gpuProcessConnection->connection().send(Messages::RemoteSourceBufferProxy::Append(SharedMemory::IPCHandle { WTFMove(handle), sharedData->size() }), m_remoteSourceBufferIdentifier);
+    m_gpuProcessConnection->connection().send(Messages::RemoteSourceBufferProxy::Append(SharedMemory::IPCHandle { WTFMove(handle), data->size() }), m_remoteSourceBufferIdentifier);
 }
 
 void SourceBufferPrivateRemote::abort()

Modified: trunk/Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.mm (294783 => 294784)


--- trunk/Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.mm	2022-05-25 01:43:45 UTC (rev 294783)
+++ trunk/Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.mm	2022-05-25 02:12:52 UTC (rev 294784)
@@ -2567,12 +2567,14 @@
             auto plainTextString = adoptNS([[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
             webProcess.parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::SetPasteboardStringForType(pasteboardName, type, plainTextString.get(), pageIdentifier), Messages::WebPasteboardProxy::SetPasteboardStringForType::Reply(newChangeCount), 0);
         } else {
+            SharedMemory::Handle handle;
             auto buffer = SharedBuffer::create(data);
-            auto sharedMemory = SharedMemory::copyBuffer(buffer.get());
-            if (!sharedMemory)
-                continue;
-            SharedMemory::Handle handle;
-            sharedMemory->createHandle(handle, SharedMemory::Protection::ReadOnly);
+            {
+                auto sharedMemory = SharedMemory::copyBuffer(buffer.get());
+                if (!sharedMemory)
+                    continue;
+                sharedMemory->createHandle(handle, SharedMemory::Protection::ReadOnly);
+            }
             webProcess.parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::SetPasteboardBufferForType(pasteboardName, type, SharedMemory::IPCHandle { WTFMove(handle), buffer->size() }, pageIdentifier), Messages::WebPasteboardProxy::SetPasteboardBufferForType::Reply(newChangeCount), 0);
         }
     }

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/mac/WebDragClientMac.mm (294783 => 294784)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/mac/WebDragClientMac.mm	2022-05-25 01:43:45 UTC (rev 294783)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/mac/WebDragClientMac.mm	2022-05-25 02:12:52 UTC (rev 294784)
@@ -153,12 +153,13 @@
     auto imageBuffer = image->image()->data();
     size_t imageSize = imageBuffer->size();
 
-    auto sharedMemoryBuffer = SharedMemory::copyBuffer(*imageBuffer);
-    if (!sharedMemoryBuffer)
-        return;
     SharedMemory::Handle imageHandle;
-    sharedMemoryBuffer->createHandle(imageHandle, SharedMemory::Protection::ReadOnly);
-    
+    {
+        auto sharedMemoryBuffer = SharedMemory::copyBuffer(*imageBuffer);
+        if (!sharedMemoryBuffer)
+            return;
+        sharedMemoryBuffer->createHandle(imageHandle, SharedMemory::Protection::ReadOnly);
+    }
     RetainPtr<CFDataRef> data = "" ? archive->rawDataRepresentation() : 0;
     SharedMemory::Handle archiveHandle;
     size_t archiveSize = 0;

Modified: trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm (294783 => 294784)


--- trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2022-05-25 01:43:45 UTC (rev 294783)
+++ trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm	2022-05-25 02:12:52 UTC (rev 294784)
@@ -3344,11 +3344,13 @@
         RefPtr<FragmentedSharedBuffer> buffer = cachedImage->resourceBuffer();
         if (!buffer)
             return;
-        auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
-        if (!sharedMemoryBuffer)
-            return;
         SharedMemory::Handle handle;
-        sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly);
+        {
+            auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
+            if (!sharedMemoryBuffer)
+                return;
+            sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly);
+        }
         send(Messages::WebPageProxy::SaveImageToLibrary(SharedMemory::IPCHandle { WTFMove(handle), buffer->size() }, authorizationToken));
     }
 }
@@ -4822,19 +4824,20 @@
 {
     ASSERT(!buffer.isEmpty());
 
-    // FIXME: In some cases, buffer conains a single segment that wraps an existing ShareableResource.
+    // FIXME: In some cases, buffer contains a single segment that wraps an existing ShareableResource.
     // If we could create a handle from that existing resource then we could avoid this extra
     // allocation and copy.
 
-    auto sharedMemory = SharedMemory::copyBuffer(buffer);
-    if (!sharedMemory)
-        return;
-
     ShareableResource::Handle handle;
-    auto shareableResource = ShareableResource::create(sharedMemory.releaseNonNull(), 0, buffer.size());
-    if (!shareableResource || !shareableResource->createHandle(handle))
-        return;
+    {
+        auto sharedMemory = SharedMemory::copyBuffer(buffer);
+        if (!sharedMemory)
+            return;
 
+        auto shareableResource = ShareableResource::create(sharedMemory.releaseNonNull(), 0, buffer.size());
+        if (!shareableResource || !shareableResource->createHandle(handle))
+            return;
+    }
     send(Messages::WebPageProxy::DidFinishLoadForQuickLookDocumentInMainFrame(handle));
 }
 

Modified: trunk/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm (294783 => 294784)


--- trunk/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm	2022-05-25 01:43:45 UTC (rev 294783)
+++ trunk/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm	2022-05-25 02:12:52 UTC (rev 294784)
@@ -509,11 +509,13 @@
     auto buffer = frame.editor().dataSelectionForPasteboard(pasteboardType);
     if (!buffer)
         return completionHandler({ });
-    auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
-    if (!sharedMemoryBuffer)
-        return completionHandler({ });
     SharedMemory::Handle handle;
-    sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly);
+    {
+        auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
+        if (!sharedMemoryBuffer)
+            return completionHandler({ });
+        sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly);
+    }
     completionHandler(SharedMemory::IPCHandle { WTFMove(handle), buffer->size() });
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to