Title: [260932] trunk/Source/WebKit
Revision
260932
Author
bfulg...@apple.com
Date
2020-04-29 20:03:17 -0700 (Wed, 29 Apr 2020)

Log Message

Improve SandboxExtension::HandleArray to reduce boilerplate
https://bugs.webkit.org/show_bug.cgi?id=211103
<rdar://problem/62533632>

Reviewed by Per Arne Vollan.

There are a number of boilerplate patterns needed when using SandboxExtension::HandleArray.
We could make these simpler and less error prone by improving the class.

This patch:
1. Adds convenience methods to create and consume HandleArrays.
2. Updates uses of HandleArray to use the convenience methods.

Tested by existing tests.

* Platform/IPC/FormDataReference.h:
(IPC::FormDataReference::decode):
* Shared/Cocoa/SandboxExtensionCocoa.mm:
(WebKit::SandboxExtension::createHandlesForFiles):
(WebKit::SandboxExtension::createHandlesForMachLookup):
(WebKit::SandboxExtension::consumePermanently):
* Shared/SandboxExtension.h:
(WebKit::createHandlesForFiles):
(WebKit::SandboxExtension::consumePermanently):
* UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::platformInitializeWebProcess):
* UIProcess/Cocoa/WebProcessProxyCocoa.mm:
(WebKit::WebProcessProxy::unblockPreferenceServiceIfNeeded):
* UIProcess/WebPageProxy.cpp:
* WebProcess/WebCoreSupport/WebPlatformStrategies.cpp:
(WebKit::WebPlatformStrategies::getPathnamesForType):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::extendSandboxForFilesFromOpenPanel):
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::initializeWebProcess):
* WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::WebProcess::platformInitializeWebProcess):
(WebKit::WebProcess::unblockPreferenceService):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (260931 => 260932)


--- trunk/Source/WebKit/ChangeLog	2020-04-30 03:00:35 UTC (rev 260931)
+++ trunk/Source/WebKit/ChangeLog	2020-04-30 03:03:17 UTC (rev 260932)
@@ -1,3 +1,44 @@
+2020-04-29  Brent Fulgham  <bfulg...@apple.com>
+
+        Improve SandboxExtension::HandleArray to reduce boilerplate
+        https://bugs.webkit.org/show_bug.cgi?id=211103
+        <rdar://problem/62533632>
+
+        Reviewed by Per Arne Vollan.
+
+        There are a number of boilerplate patterns needed when using SandboxExtension::HandleArray.
+        We could make these simpler and less error prone by improving the class.
+
+        This patch:
+        1. Adds convenience methods to create and consume HandleArrays.
+        2. Updates uses of HandleArray to use the convenience methods.
+
+        Tested by existing tests.
+
+        * Platform/IPC/FormDataReference.h:
+        (IPC::FormDataReference::decode):
+        * Shared/Cocoa/SandboxExtensionCocoa.mm:
+        (WebKit::SandboxExtension::createHandlesForFiles):
+        (WebKit::SandboxExtension::createHandlesForMachLookup):
+        (WebKit::SandboxExtension::consumePermanently):
+        * Shared/SandboxExtension.h:
+        (WebKit::createHandlesForFiles):
+        (WebKit::SandboxExtension::consumePermanently):
+        * UIProcess/Cocoa/WebProcessPoolCocoa.mm:
+        (WebKit::WebProcessPool::platformInitializeWebProcess):
+        * UIProcess/Cocoa/WebProcessProxyCocoa.mm:
+        (WebKit::WebProcessProxy::unblockPreferenceServiceIfNeeded):
+        * UIProcess/WebPageProxy.cpp:
+        * WebProcess/WebCoreSupport/WebPlatformStrategies.cpp:
+        (WebKit::WebPlatformStrategies::getPathnamesForType):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::extendSandboxForFilesFromOpenPanel):
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::initializeWebProcess):
+        * WebProcess/cocoa/WebProcessCocoa.mm:
+        (WebKit::WebProcess::platformInitializeWebProcess):
+        (WebKit::WebProcess::unblockPreferenceService):
+
 2020-04-29  Chris Dumez  <cdu...@apple.com>
 
         REGRESSION(r260791) Network process fails to suspend promptly

Modified: trunk/Source/WebKit/Platform/IPC/FormDataReference.h (260931 => 260932)


--- trunk/Source/WebKit/Platform/IPC/FormDataReference.h	2020-04-30 03:00:35 UTC (rev 260931)
+++ trunk/Source/WebKit/Platform/IPC/FormDataReference.h	2020-04-30 03:03:17 UTC (rev 260932)
@@ -85,8 +85,7 @@
         if (!sandboxExtensionHandles)
             return WTF::nullopt;
 
-        for (size_t i = 0; i < sandboxExtensionHandles->size(); ++i)
-            WebKit::SandboxExtension::consumePermanently(sandboxExtensionHandles->at(i));
+        WebKit::SandboxExtension::consumePermanently(*sandboxExtensionHandles);
 
         return FormDataReference { formData.releaseNonNull() };
     }

Modified: trunk/Source/WebKit/Shared/Cocoa/SandboxExtensionCocoa.mm (260931 => 260932)


--- trunk/Source/WebKit/Shared/Cocoa/SandboxExtensionCocoa.mm	2020-04-30 03:00:35 UTC (rev 260931)
+++ trunk/Source/WebKit/Shared/Cocoa/SandboxExtensionCocoa.mm	2020-04-30 03:03:17 UTC (rev 260932)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2019 Apple Inc. All rights reserved.
+ * Copyright (C) 2010-2020 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -293,6 +293,37 @@
     return createHandleWithoutResolvingPath(resolvePathForSandboxExtension(path), type, handle);
 }
 
+static SandboxExtension::HandleArray createHandlesForResources(const Vector<String>& resources, Function<bool(const String&, SandboxExtension::Handle& handle)>&& createFunction)
+{
+    SandboxExtension::HandleArray handleArray;
+
+    if (resources.size() > 0)
+        handleArray.allocate(resources.size());
+
+    size_t currentHandle = 0;
+    for (const auto& resource : resources) {
+        if (!createFunction(resource, handleArray[currentHandle]))
+            continue;
+        ++currentHandle;
+    }
+    
+    return handleArray;
+}
+
+SandboxExtension::HandleArray SandboxExtension::createReadOnlyHandlesForFiles(const String& logLabel, const Vector<String>& paths)
+{
+    return createHandlesForResources(paths, [&logLabel] (const String& path, Handle& handle) {
+        if (!SandboxExtension::createHandle(path, SandboxExtension::Type::ReadOnly, handle)) {
+            // This can legitimately fail if a directory containing the file is deleted after the file was chosen.
+            // We also have reports of cases where this likely fails for some unknown reason, <rdar://problem/10156710>.
+            WTFLogAlways("%s: could not create a sandbox extension for '%s'\n", logLabel.utf8().data(), path.utf8().data());
+            ASSERT_NOT_REACHED();
+            return false;
+        }
+        return true;
+    });
+}
+
 bool SandboxExtension::createHandleForReadWriteDirectory(const String& path, SandboxExtension::Handle& handle)
 {
     String resolvedPath = resolveAndCreateReadWriteDirectoryForSandboxExtension(path);
@@ -357,6 +388,17 @@
     return true;
 }
 
+SandboxExtension::HandleArray SandboxExtension::createHandlesForMachLookup(const Vector<String>& services, Optional<audit_token_t> auditToken, OptionSet<Flags> flags)
+{
+    return createHandlesForResources(services, [auditToken, flags] (const String& service, Handle& handle) {
+        if (!SandboxExtension::createHandleForMachLookup(service, auditToken, handle, flags)) {
+            ASSERT_NOT_REACHED();
+            return false;
+        }
+        return true;
+    });
+}
+
 bool SandboxExtension::createHandleForReadByAuditToken(const String& path, audit_token_t auditToken, Handle& handle)
 {
     ASSERT(!handle.m_sandboxExtension);
@@ -383,6 +425,17 @@
     return true;
 }
 
+SandboxExtension::HandleArray SandboxExtension::createHandlesForIOKitClassExtensions(const Vector<String>& iokitClasses, Optional<audit_token_t> auditToken, OptionSet<Flags> flags)
+{
+    return createHandlesForResources(iokitClasses, [auditToken, flags] (const String& iokitClass, Handle& handle) {
+        if (!SandboxExtension::createHandleForIOKitClassExtension(iokitClass, auditToken, handle, flags)) {
+            ASSERT_NOT_REACHED();
+            return false;
+        }
+        return true;
+    });
+}
+
 SandboxExtension::SandboxExtension(const Handle& handle)
     : m_sandboxExtension(WTFMove(handle.m_sandboxExtension))
 {
@@ -442,6 +495,21 @@
     return result;
 }
 
+bool SandboxExtension::consumePermanently(const HandleArray& handleArray)
+{
+    bool allSucceeded = true;
+    for (auto& handle : handleArray) {
+        if (!handle.m_sandboxExtension)
+            continue;
+
+        bool ok = SandboxExtension::consumePermanently(handle);
+        ASSERT(ok);
+        allSucceeded &= ok;
+    }
+
+    return allSucceeded;
+}
+
 } // namespace WebKit
 
 #endif // ENABLE(SANDBOX_EXTENSIONS)

Modified: trunk/Source/WebKit/Shared/SandboxExtension.h (260931 => 260932)


--- trunk/Source/WebKit/Shared/SandboxExtension.h	2020-04-30 03:00:35 UTC (rev 260931)
+++ trunk/Source/WebKit/Shared/SandboxExtension.h	2020-04-30 03:03:17 UTC (rev 260932)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010-2020 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -93,6 +93,10 @@
         Handle& operator[](size_t i);
         Handle& at(size_t i) { return operator[](i); }
         const Handle& operator[](size_t i) const;
+        Handle* begin();
+        Handle* end();
+        const Handle* begin() const;
+        const Handle* end() const;
         size_t size() const;
         void encode(IPC::Encoder&) const;
         static Optional<HandleArray> decode(IPC::Decoder&);
@@ -107,6 +111,7 @@
     
     static RefPtr<SandboxExtension> create(Handle&&);
     static bool createHandle(const String& path, Type, Handle&);
+    static SandboxExtension::HandleArray createReadOnlyHandlesForFiles(const String& logLabel, const Vector<String>& paths);
     static bool createHandleWithoutResolvingPath(const String& path, Type, Handle&);
     static bool createHandleForReadWriteDirectory(const String& path, Handle&); // Will attempt to create the directory.
     static String createHandleForTemporaryFile(const String& prefix, Type, Handle&);
@@ -113,8 +118,10 @@
     static bool createHandleForGenericExtension(const String& extensionClass, Handle&);
 #if HAVE(AUDIT_TOKEN)
     static bool createHandleForMachLookup(const String& service, Optional<audit_token_t>, Handle&, OptionSet<Flags> = Flags::Default);
+    static HandleArray createHandlesForMachLookup(const Vector<String>& services, Optional<audit_token_t>, OptionSet<Flags> = Flags::Default);
     static bool createHandleForReadByAuditToken(const String& path, audit_token_t, Handle&);
     static bool createHandleForIOKitClassExtension(const String& iokitClass, Optional<audit_token_t>, Handle&, OptionSet<Flags> = Flags::Default);
+    static HandleArray createHandlesForIOKitClassExtensions(const Vector<String>& iokitClasses, Optional<audit_token_t>, OptionSet<Flags> = Flags::Default);
 #endif
     ~SandboxExtension();
 
@@ -123,6 +130,7 @@
 
     bool consumePermanently();
     static bool consumePermanently(const Handle&);
+    static bool consumePermanently(const HandleArray&);
 
 private:
     explicit SandboxExtension(const Handle&);
@@ -144,10 +152,15 @@
 inline size_t SandboxExtension::HandleArray::size() const { return 0; }    
 inline const SandboxExtension::Handle& SandboxExtension::HandleArray::operator[](size_t) const { return m_emptyHandle; }
 inline SandboxExtension::Handle& SandboxExtension::HandleArray::operator[](size_t) { return m_emptyHandle; }
+inline SandboxExtension::Handle* SandboxExtension::HandleArray::begin() { return &m_emptyHandle; }
+inline SandboxExtension::Handle* SandboxExtension::HandleArray::end() { return &m_emptyHandle; }
+inline const SandboxExtension::Handle* SandboxExtension::HandleArray::begin() const { return &m_emptyHandle; }
+inline const SandboxExtension::Handle* SandboxExtension::HandleArray::end() const { return &m_emptyHandle; }
 inline void SandboxExtension::HandleArray::encode(IPC::Encoder&) const { }
 inline auto SandboxExtension::HandleArray::decode(IPC::Decoder&) -> Optional<HandleArray> { return {{ }}; }
 inline RefPtr<SandboxExtension> SandboxExtension::create(Handle&&) { return nullptr; }
 inline bool SandboxExtension::createHandle(const String&, Type, Handle&) { return true; }
+inline SandboxExtension::HandleArray SandboxExtension::createReadOnlyHandlesForFiles(const String&, const Vector<String>&) { return { }; }
 inline bool SandboxExtension::createHandleWithoutResolvingPath(const String&, Type, Handle&) { return true; }
 inline bool SandboxExtension::createHandleForReadWriteDirectory(const String&, Handle&) { return true; }
 inline String SandboxExtension::createHandleForTemporaryFile(const String& /*prefix*/, Type, Handle&) {return String();}
@@ -157,10 +170,15 @@
 inline bool SandboxExtension::consume() { return true; }
 inline bool SandboxExtension::consumePermanently() { return true; }
 inline bool SandboxExtension::consumePermanently(const Handle&) { return true; }
+inline bool SandboxExtension::consumePermanently(const HandleArray&) { return true; }
 inline String stringByResolvingSymlinksInPath(const String& path) { return path; }
 inline String resolvePathForSandboxExtension(const String& path) { return path; }
 inline String resolveAndCreateReadWriteDirectoryForSandboxExtension(const String& path) { return path; }
 #else
+inline SandboxExtension::Handle* SandboxExtension::HandleArray::begin() { return m_data.begin(); }
+inline SandboxExtension::Handle* SandboxExtension::HandleArray::end() { return m_data.end(); }
+inline const SandboxExtension::Handle* SandboxExtension::HandleArray::begin() const { return m_data.begin(); }
+inline const SandboxExtension::Handle* SandboxExtension::HandleArray::end() const { return m_data.end(); }
 String stringByResolvingSymlinksInPath(const String& path);
 String resolvePathForSandboxExtension(const String& path);
 String resolveAndCreateReadWriteDirectoryForSandboxExtension(const String& path);

Modified: trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm (260931 => 260932)


--- trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2020-04-30 03:00:35 UTC (rev 260931)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2020-04-30 03:03:17 UTC (rev 260932)
@@ -244,6 +244,39 @@
     return services;
 }
 
+#if PLATFORM(IOS_FAMILY)
+static const Vector<String>& nonBrowserServices()
+{
+    ASSERT(isMainThread());
+    static const auto services = makeNeverDestroyed(Vector<String> {
+        "com.apple.lsd.open",
+        "com.apple.mobileassetd",
+        "com.apple.iconservices",
+        "com.apple.PowerManagement.control",
+        "com.apple.frontboard.systemappservices"
+    });
+    return services;
+}
+
+static const Vector<String>& agxCompilerClasses()
+{
+    ASSERT(isMainThread());
+    static const auto iokitClasses = makeNeverDestroyed(Vector<String> {
+        "AGXCommandQueue",
+        "AGXDevice",
+        "AGXSharedUserClient",
+        "IOAccelContext",
+        "IOAccelContext2",
+        "IOAccelDevice",
+        "IOAccelDevice2",
+        "IOAccelSharedUserClient",
+        "IOAccelSharedUserClient2"
+        "IOAccelSubmitter2",
+    });
+    return iokitClasses;
+}
+#endif
+
 void WebProcessPool::platformInitializeWebProcess(const WebProcessProxy& process, WebProcessCreationParameters& parameters)
 {
     parameters.mediaMIMETypes = process.mediaMIMETypes();
@@ -351,19 +384,8 @@
 #endif
 
 #if PLATFORM(IOS_FAMILY)
-    if (!WebCore::IOSApplication::isMobileSafari() || _AXSApplicationAccessibilityEnabled()) {
-        static const char* services[] = {
-            "com.apple.lsd.open",
-            "com.apple.mobileassetd",
-            "com.apple.iconservices",
-            "com.apple.PowerManagement.control",
-            "com.apple.frontboard.systemappservices"
-        };
-        auto size = WTF_ARRAY_LENGTH(services);
-        parameters.dynamicMachExtensionHandles.allocate(size);
-        for (size_t i = 0; i < size; ++i)
-            SandboxExtension::createHandleForMachLookup(services[i], WTF::nullopt, parameters.dynamicMachExtensionHandles[i]);
-    }
+    if (!WebCore::IOSApplication::isMobileSafari() || _AXSApplicationAccessibilityEnabled())
+        parameters.dynamicMachExtensionHandles = SandboxExtension::createHandlesForMachLookup(nonBrowserServices(), WTF::nullopt);
     
     if (isInternalInstall()) {
         SandboxExtension::Handle diagnosticsExtensionHandle;
@@ -375,24 +397,8 @@
     if (SandboxExtension::createHandleForMachLookup("com.apple.runningboard", WTF::nullopt, runningboardExtensionHandle, SandboxExtension::Flags::NoReport))
         parameters.runningboardExtensionHandle = WTFMove(runningboardExtensionHandle);
 
-    if (WebCore::deviceHasAGXCompilerService()) {
-        static const char* const ioKitClasses[] = {
-            "AGXCommandQueue",
-            "AGXDevice",
-            "AGXSharedUserClient",
-            "IOAccelContext",
-            "IOAccelContext2",
-            "IOAccelDevice",
-            "IOAccelDevice2",
-            "IOAccelSharedUserClient",
-            "IOAccelSharedUserClient2"
-            "IOAccelSubmitter2",
-        };
-        auto size = WTF_ARRAY_LENGTH(ioKitClasses);
-        parameters.dynamicIOKitExtensionHandles.allocate(size);
-        for (size_t i = 0; i < size; ++i)
-            SandboxExtension::createHandleForIOKitClassExtension(ioKitClasses[i], WTF::nullopt, parameters.dynamicIOKitExtensionHandles[i]);
-    }
+    if (WebCore::deviceHasAGXCompilerService())
+        parameters.dynamicIOKitExtensionHandles = SandboxExtension::createHandlesForIOKitClassExtensions(agxCompilerClasses(), WTF::nullopt);
 #endif
     
 #if PLATFORM(COCOA)
@@ -442,30 +448,13 @@
 
     if (needWebProcessExtensions) {
         // FIXME(207716): The following should be removed when the GPU process is complete.
-        const auto& services = mediaRelatedMachServices();
-        parameters.mediaExtensionHandles.allocate(services.size());
-        for (size_t i = 0, size = services.size(); i < size; ++i)
-            SandboxExtension::createHandleForMachLookup(services[i], WTF::nullopt, parameters.mediaExtensionHandles[i]);
+        parameters.mediaExtensionHandles = SandboxExtension::createHandlesForMachLookup(mediaRelatedMachServices(), WTF::nullopt);
     }
 
 #if ENABLE(CFPREFS_DIRECT_MODE)
 #if PLATFORM(IOS_FAMILY)
-    if (_AXSApplicationAccessibilityEnabled()) {
-        SandboxExtension::HandleArray preferencesExtensionHandles;
-        
-        static constexpr const char* services[] = {
-            "com.apple.cfprefsd.agent",
-            "com.apple.cfprefsd.daemon"
-        };
-        auto size = std::size(services);
-        preferencesExtensionHandles.allocate(size);
-        for (size_t i = 0; i < size; ++i) {
-            bool ok = SandboxExtension::createHandleForMachLookup(services[i], WTF::nullopt, preferencesExtensionHandles[i]);
-            ASSERT_UNUSED(ok, ok);
-        }
-        
-        parameters.preferencesExtensionHandles = WTFMove(preferencesExtensionHandles);
-    }
+    if (_AXSApplicationAccessibilityEnabled())
+        parameters.preferencesExtensionHandles = SandboxExtension::createHandlesForMachLookup({ "com.apple.cfprefsd.agent"_s, "com.apple.cfprefsd.daemon"_s }, WTF::nullopt);
 #endif
 
     auto globalPreferencesDictionary = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, nullptr, nullptr));

Modified: trunk/Source/WebKit/UIProcess/Cocoa/WebProcessProxyCocoa.mm (260931 => 260932)


--- trunk/Source/WebKit/UIProcess/Cocoa/WebProcessProxyCocoa.mm	2020-04-30 03:00:35 UTC (rev 260931)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WebProcessProxyCocoa.mm	2020-04-30 03:03:17 UTC (rev 260932)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014-2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-2020 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -239,19 +239,10 @@
     if (!canSendMessage())
         return;
 
-    SandboxExtension::HandleArray handleArray;
-    static constexpr const char* services[] = {
-        "com.apple.cfprefsd.agent",
-        "com.apple.cfprefsd.daemon"
-    };
-    auto size = std::size(services);
-    handleArray.allocate(size);
-    for (size_t i = 0; i < size; ++i) {
-        if (!SandboxExtension::createHandleForMachLookup(services[i], connection() ? connection()->getAuditToken() : WTF::nullopt, handleArray[i]))
-            return;
-    }
+    auto handleArray = SandboxExtension::createHandlesForMachLookup({ "com.apple.cfprefsd.agent"_s, "com.apple.cfprefsd.daemon"_s }, connection() ? connection()->getAuditToken() : WTF::nullopt);
+    ASSERT(handleArray.size() == 2);
     
-    send(Messages::WebProcess::UnblockPreferenceService(handleArray), 0);
+    send(Messages::WebProcess::UnblockPreferenceService(WTFMove(handleArray)), 0);
     m_hasSentMessageToUnblockPreferenceService = true;
 }
 #endif

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (260931 => 260932)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2020-04-30 03:00:35 UTC (rev 260931)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2020-04-30 03:03:17 UTC (rev 260932)
@@ -6632,12 +6632,8 @@
         return;
 
 #if ENABLE(SANDBOX_EXTENSIONS)
-    SandboxExtension::HandleArray sandboxExtensionHandles;
-    sandboxExtensionHandles.allocate(fileURLs.size());
-    for (size_t i = 0; i < fileURLs.size(); ++i)
-        SandboxExtension::createHandle(fileURLs[i], SandboxExtension::Type::ReadOnly, sandboxExtensionHandles[i]);
-
-    send(Messages::WebPage::ExtendSandboxForFilesFromOpenPanel(sandboxExtensionHandles));
+    auto sandboxExtensionHandles = SandboxExtension::createReadOnlyHandlesForFiles("WebPageProxy::didChooseFilesForOpenPanelWithDisplayStringAndIcon"_s, fileURLs);
+    send(Messages::WebPage::ExtendSandboxForFilesFromOpenPanel(WTFMove(sandboxExtensionHandles)));
 #endif
 
     SandboxExtension::Handle frontboardServicesSandboxExtension, iconServicesSandboxExtension;
@@ -6657,19 +6653,8 @@
         return;
 
 #if ENABLE(SANDBOX_EXTENSIONS)
-    SandboxExtension::HandleArray sandboxExtensionHandles;
-    sandboxExtensionHandles.allocate(fileURLs.size());
-    for (size_t i = 0; i < fileURLs.size(); ++i) {
-        bool createdExtension = SandboxExtension::createHandle(fileURLs[i], SandboxExtension::Type::ReadOnly, sandboxExtensionHandles[i]);
-        if (!createdExtension) {
-            // This can legitimately fail if a directory containing the file is deleted after the file was chosen.
-            // We also have reports of cases where this likely fails for some unknown reason, <rdar://problem/10156710>.
-            WTFLogAlways("WebPageProxy::didChooseFilesForOpenPanel: could not create a sandbox extension for '%s'\n", fileURLs[i].utf8().data());
-            continue;
-        }
-    }
-
-    send(Messages::WebPage::ExtendSandboxForFilesFromOpenPanel(sandboxExtensionHandles));
+    auto sandboxExtensionHandles = SandboxExtension::createReadOnlyHandlesForFiles("WebPageProxy::didChooseFilesForOpenPanel"_s, fileURLs);
+    send(Messages::WebPage::ExtendSandboxForFilesFromOpenPanel(WTFMove(sandboxExtensionHandles)));
 #endif
 
     send(Messages::WebPage::DidChooseFilesForOpenPanel(fileURLs));

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp (260931 => 260932)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp	2020-04-30 03:00:35 UTC (rev 260931)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebPlatformStrategies.cpp	2020-04-30 03:03:17 UTC (rev 260932)
@@ -149,10 +149,7 @@
     WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::GetPasteboardPathnamesForType(pasteboardName, pasteboardType),
         Messages::WebPasteboardProxy::GetPasteboardPathnamesForType::Reply(pathnames, sandboxExtensionsHandleArray), 0);
     ASSERT(pathnames.size() == sandboxExtensionsHandleArray.size());
-    for (size_t i = 0; i < sandboxExtensionsHandleArray.size(); i++) {
-        if (auto extension = SandboxExtension::create(WTFMove(sandboxExtensionsHandleArray[i])))
-            extension->consumePermanently();
-    }
+    SandboxExtension::consumePermanently(sandboxExtensionsHandleArray);
 }
 
 String WebPlatformStrategies::stringForType(const String& pasteboardType, const String& pasteboardName)

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (260931 => 260932)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2020-04-30 03:00:35 UTC (rev 260931)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2020-04-30 03:03:17 UTC (rev 260932)
@@ -4277,12 +4277,10 @@
 #if ENABLE(SANDBOX_EXTENSIONS)
 void WebPage::extendSandboxForFilesFromOpenPanel(SandboxExtension::HandleArray&& handles)
 {
-    for (size_t i = 0; i < handles.size(); ++i) {
-        bool result = SandboxExtension::consumePermanently(handles[i]);
-        if (!result) {
-            // We have reports of cases where this fails for some unknown reason, <rdar://problem/10156710>.
-            WTFLogAlways("WebPage::extendSandboxForFileFromOpenPanel(): Could not consume a sandbox extension");
-        }
+    bool result = SandboxExtension::consumePermanently(handles);
+    if (!result) {
+        // We have reports of cases where this fails for some unknown reason, <rdar://problem/10156710>.
+        WTFLogAlways("WebPage::extendSandboxForFileFromOpenPanel(): Could not consume a sandbox extension");
     }
 }
 #endif

Modified: trunk/Source/WebKit/WebProcess/WebProcess.cpp (260931 => 260932)


--- trunk/Source/WebKit/WebProcess/WebProcess.cpp	2020-04-30 03:00:35 UTC (rev 260931)
+++ trunk/Source/WebKit/WebProcess/WebProcess.cpp	2020-04-30 03:03:17 UTC (rev 260932)
@@ -373,8 +373,7 @@
         memoryPressureHandler.install();
     }
 
-    for (size_t i = 0, size = parameters.additionalSandboxExtensionHandles.size(); i < size; ++i)
-        SandboxExtension::consumePermanently(parameters.additionalSandboxExtensionHandles[i]);
+    SandboxExtension::consumePermanently(parameters.additionalSandboxExtensionHandles);
 
     if (!parameters.injectedBundlePath.isEmpty())
         m_injectedBundle = InjectedBundle::create(parameters, transformHandlesToObjects(parameters.initializationUserData.object()).get());

Modified: trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm (260931 => 260932)


--- trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2020-04-30 03:00:35 UTC (rev 260931)
+++ trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2020-04-30 03:03:17 UTC (rev 260932)
@@ -323,11 +323,8 @@
     if (parameters.diagnosticsExtensionHandle)
         SandboxExtension::consumePermanently(*parameters.diagnosticsExtensionHandle);
 
-    for (size_t i = 0, size = parameters.dynamicMachExtensionHandles.size(); i < size; ++i)
-        SandboxExtension::consumePermanently(parameters.dynamicMachExtensionHandles[i]);
-
-    for (size_t i = 0, size = parameters.dynamicIOKitExtensionHandles.size(); i < size; ++i)
-        SandboxExtension::consumePermanently(parameters.dynamicIOKitExtensionHandles[i]);
+    SandboxExtension::consumePermanently(parameters.dynamicMachExtensionHandles);
+    SandboxExtension::consumePermanently(parameters.dynamicIOKitExtensionHandles);
 #endif
     
     if (parameters.neHelperExtensionHandle)
@@ -344,16 +341,11 @@
 #endif
 
     // FIXME(207716): The following should be removed when the GPU process is complete.
-    for (size_t i = 0, size = parameters.mediaExtensionHandles.size(); i < size; ++i)
-        SandboxExtension::consumePermanently(parameters.mediaExtensionHandles[i]);
+    SandboxExtension::consumePermanently(parameters.mediaExtensionHandles);
 
 #if ENABLE(CFPREFS_DIRECT_MODE)
     if (parameters.preferencesExtensionHandles) {
-        for (size_t i = 0; i < parameters.preferencesExtensionHandles->size(); ++i) {
-            bool ok = SandboxExtension::consumePermanently(parameters.preferencesExtensionHandles->at(i));
-            ASSERT_UNUSED(ok, ok);
-        }
-
+        SandboxExtension::consumePermanently(*parameters.preferencesExtensionHandles);
         _CFPrefsSetDirectModeEnabled(false);
     }
 #endif
@@ -963,11 +955,7 @@
 
 void WebProcess::unblockPreferenceService(SandboxExtension::HandleArray&& handleArray)
 {
-    for (size_t i = 0; i < handleArray.size(); ++i) {
-        bool ok = SandboxExtension::consumePermanently(handleArray[i]);
-        ASSERT_UNUSED(ok, ok);
-    }
-
+    SandboxExtension::consumePermanently(handleArray);
     _CFPrefsSetDirectModeEnabled(false);
 }
 #endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to