⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 286097 in webkit


Ignore:
Timestamp:
Nov 20, 2021, 3:21:55 PM (5 years ago)
Author:
Jean-Yves Avenard
Message:

Remove unnecessary flattening of SharedBuffer when sending them over IPC
https://bugs.webkit.org/show_bug.cgi?id=233363
rdar://85600684

Reviewed by Sam Weinig.

In several places, a SharedMemory was allocated followed by a copy. To perform
this copy, the SharedBuffer was flattened which could involve a memory allocation
followed by a copy of all segments into the final vector.
We instead make use of SharedBuffer::copyBuffer convenience method which will simply
copy the individual segment into the newly allocated SharedMemory.

No change in user observable behaviour.

Fly-by fix: SharedMemory::allocate is fallible; few instances didn't check the
returned value. So test that it succeeded and prevent a crash (null deref)

  • Shared/WebHitTestResultData.cpp:

(WebKit::WebHitTestResultData::WebHitTestResultData):

  • UIProcess/Cocoa/WebPasteboardProxyCocoa.mm:

(WebKit::WebPasteboardProxy::getPasteboardBufferForType):
(WebKit::WebPasteboardProxy::readBufferFromPasteboard):

  • WebProcess/Plugins/PDF/PDFPlugin.mm:

(WebKit::PDFPlugin::writeItemsToPasteboard):

  • WebProcess/WebCoreSupport/WebPlatformStrategies.cpp:

(WebKit::WebPlatformStrategies::setBufferForType):

  • WebProcess/WebCoreSupport/mac/WebDragClientMac.mm:

(WebKit::WebDragClient::declareAndWriteDragImage):

  • WebProcess/WebPage/ios/WebPageIOS.mm:

(WebKit::WebPage::performActionOnElement):

  • WebProcess/WebPage/mac/WebPageMac.mm:

(WebKit::WebPage::getDataSelectionForPasteboard):

Location:
trunk/Source/WebKit
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r286094 r286097  
     12021-11-20  Jean-Yves Avenard  <jya@apple.com>
     2
     3        Remove unnecessary flattening of SharedBuffer when sending them over IPC
     4        https://bugs.webkit.org/show_bug.cgi?id=233363
     5        rdar://85600684
     6
     7        Reviewed by Sam Weinig.
     8
     9        In several places, a SharedMemory was allocated followed by a copy. To perform
     10        this copy, the SharedBuffer was flattened which could involve a memory allocation
     11        followed by a copy of all segments into the final vector.
     12        We instead make use of SharedBuffer::copyBuffer convenience method which will simply
     13        copy the individual segment into the newly allocated SharedMemory.
     14
     15        No change in user observable behaviour.
     16
     17        Fly-by fix: SharedMemory::allocate is fallible; few instances didn't check the
     18        returned value. So test that it succeeded and prevent a crash (null deref)
     19
     20        * Shared/WebHitTestResultData.cpp:
     21        (WebKit::WebHitTestResultData::WebHitTestResultData):
     22        * UIProcess/Cocoa/WebPasteboardProxyCocoa.mm:
     23        (WebKit::WebPasteboardProxy::getPasteboardBufferForType):
     24        (WebKit::WebPasteboardProxy::readBufferFromPasteboard):
     25        * WebProcess/Plugins/PDF/PDFPlugin.mm:
     26        (WebKit::PDFPlugin::writeItemsToPasteboard):
     27        * WebProcess/WebCoreSupport/WebPlatformStrategies.cpp:
     28        (WebKit::WebPlatformStrategies::setBufferForType):
     29        * WebProcess/WebCoreSupport/mac/WebDragClientMac.mm:
     30        (WebKit::WebDragClient::declareAndWriteDragImage):
     31        * WebProcess/WebPage/ios/WebPageIOS.mm:
     32        (WebKit::WebPage::performActionOnElement):
     33        * WebProcess/WebPage/mac/WebPageMac.mm:
     34        (WebKit::WebPage::getDataSelectionForPasteboard):
     35
    1362021-11-20  Carlos Garcia Campos  <cgarcia@igalia.com>
    237
  • trunk/Source/WebKit/Shared/WebHitTestResultData.cpp

    r285316 r286097  
    8888        RefPtr<SharedBuffer> buffer = image->data();
    8989        if (buffer) {
    90             imageSharedMemory = WebKit::SharedMemory::allocate(buffer->size());
    91             memcpy(imageSharedMemory->data(), buffer->data(), buffer->size());
     90            imageSharedMemory = WebKit::SharedMemory::copyBuffer(*buffer);
    9291            imageSize = buffer->size();
    9392        }
  • trunk/Source/WebKit/UIProcess/Cocoa/WebPasteboardProxyCocoa.mm

    r284142 r286097  
    234234        if (!size)
    235235            return completionHandler({ });
    236         RefPtr<SharedMemory> sharedMemoryBuffer = SharedMemory::allocate(size);
     236        auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
    237237        if (!sharedMemoryBuffer)
    238238            return completionHandler({ });
    239         memcpy(sharedMemoryBuffer->data(), buffer->data(), size);
    240239        SharedMemory::Handle handle;
    241240        if (!sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly))
     
    557556        if (!size)
    558557            return completionHandler({ });
    559         RefPtr<SharedMemory> sharedMemoryBuffer = SharedMemory::allocate(size);
     558        auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
    560559        if (!sharedMemoryBuffer)
    561560            return completionHandler({ });
    562         memcpy(sharedMemoryBuffer->data(), buffer->data(), size);
    563561        SharedMemory::Handle handle;
    564562        if (!sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly))
  • trunk/Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.mm

    r285316 r286097  
    26642664        } else {
    26652665            auto buffer = SharedBuffer::create(data);
     2666            auto sharedMemory = SharedMemory::copyBuffer(buffer.get());
     2667            if (!sharedMemory)
     2668                continue;
    26662669            SharedMemory::Handle handle;
    2667             auto sharedMemory = SharedMemory::allocate(buffer->size());
    2668             memcpy(sharedMemory->data(), buffer->data(), buffer->size());
    26692670            sharedMemory->createHandle(handle, SharedMemory::Protection::ReadOnly);
    26702671            webProcess.parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::SetPasteboardBufferForType(pasteboardName, type, SharedMemory::IPCHandle { WTFMove(handle), buffer->size() }, pageIdentifier), Messages::WebPasteboardProxy::SetPasteboardBufferForType::Reply(newChangeCount), 0);
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp

    r285047 r286097  
    212212    SharedMemory::Handle handle;
    213213    if (buffer && buffer->size()) {
    214         RefPtr<SharedMemory> sharedMemoryBuffer = SharedMemory::allocate(buffer->size());
     214        auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
    215215        // FIXME: Null check prevents crashing, but it is not great that we will have empty pasteboard content for this type,
    216216        // because we've already set the types.
    217         if (sharedMemoryBuffer) {
    218             memcpy(sharedMemoryBuffer->data(), buffer->data(), buffer->size());
     217        if (sharedMemoryBuffer)
    219218            sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly);
    220         }
    221219    }
    222220    int64_t newChangeCount { 0 };
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/mac/WebDragClientMac.mm

    r283851 r286097  
    153153    RefPtr<SharedBuffer> imageBuffer = image->image()->data();
    154154    size_t imageSize = imageBuffer->size();
    155     SharedMemory::Handle imageHandle;
    156    
    157     RefPtr<SharedMemory> sharedMemoryBuffer = SharedMemory::allocate(imageBuffer->size());
     155
     156    auto sharedMemoryBuffer = SharedMemory::copyBuffer(*imageBuffer);
    158157    if (!sharedMemoryBuffer)
    159158        return;
    160     memcpy(sharedMemoryBuffer->data(), imageBuffer->data(), imageSize);
     159    SharedMemory::Handle imageHandle;
    161160    sharedMemoryBuffer->createHandle(imageHandle, SharedMemory::Protection::ReadOnly);
    162161   
     
    166165    if (data) {
    167166        auto archiveBuffer = SharedBuffer::create((__bridge NSData *)data.get());
    168         RefPtr<SharedMemory> archiveSharedMemoryBuffer = SharedMemory::allocate(archiveBuffer->size());
     167        auto archiveSharedMemoryBuffer = SharedMemory::copyBuffer(archiveBuffer.get());
    169168        if (!archiveSharedMemoryBuffer)
    170169            return;
    171170        archiveSize = archiveBuffer->size();
    172         memcpy(archiveSharedMemoryBuffer->data(), archiveBuffer->data(), archiveSize);
    173171        archiveSharedMemoryBuffer->createHandle(archiveHandle, SharedMemory::Protection::ReadOnly);
    174172    }
  • trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm

    r285655 r286097  
    32213221        if (!buffer)
    32223222            return;
    3223         uint64_t bufferSize = buffer->size();
    3224         RefPtr<SharedMemory> sharedMemoryBuffer = SharedMemory::allocate(bufferSize);
    3225         memcpy(sharedMemoryBuffer->data(), buffer->data(), bufferSize);
     3223        auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
     3224        if (!sharedMemoryBuffer)
     3225            return;
    32263226        SharedMemory::Handle handle;
    32273227        sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly);
    3228         send(Messages::WebPageProxy::SaveImageToLibrary(SharedMemory::IPCHandle { WTFMove(handle), bufferSize }));
     3228        send(Messages::WebPageProxy::SaveImageToLibrary(SharedMemory::IPCHandle { WTFMove(handle), buffer->size() }));
    32293229    }
    32303230}
  • trunk/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm

    r285655 r286097  
    570570    if (!buffer)
    571571        return completionHandler({ });
    572     uint64_t size = buffer->size();
    573     RefPtr<SharedMemory> sharedMemoryBuffer = SharedMemory::allocate(size);
    574     memcpy(sharedMemoryBuffer->data(), buffer->data(), size);
     572    auto sharedMemoryBuffer = SharedMemory::copyBuffer(*buffer);
     573    if (!sharedMemoryBuffer)
     574        return completionHandler({ });
    575575    SharedMemory::Handle handle;
    576576    sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly);
    577     completionHandler(SharedMemory::IPCHandle { WTFMove(handle), size });
     577    completionHandler(SharedMemory::IPCHandle { WTFMove(handle), buffer->size() });
    578578}
    579579
Note: See TracChangeset for help on using the changeset viewer.