Title: [295087] trunk/Source/WebKit
Revision
295087
Author
pvol...@apple.com
Date
2022-06-01 08:04:44 -0700 (Wed, 01 Jun 2022)

Log Message

[iOS][GPUP] Apply workaround for invalid Mobile Gestalt cache
https://bugs.webkit.org/show_bug.cgi?id=241036
<rdar://93614152>

Reviewed by Geoffrey Garen.

In the WebContent process on iOS, we have a workaround to repopulate the Mobile Gestalt cache in case
the disk version is invalid. This workaround should be applied to the GPU process as well.

* Source/WebKit/GPUProcess/GPUProcessCreationParameters.cpp:
(WebKit::GPUProcessCreationParameters::encode const):
(WebKit::GPUProcessCreationParameters::decode):
* Source/WebKit/GPUProcess/GPUProcessCreationParameters.h:
* Source/WebKit/Resources/SandboxProfiles/ios/com.apple.WebKit.GPU.sb.in:
* Source/WebKit/Shared/AuxiliaryProcess.h:
* Source/WebKit/Shared/AuxiliaryProcess.cpp:
(WebKit::AuxiliaryProcess::populateMobileGestaltCache):
* Source/WebKit/Shared/ios/AuxiliaryProcessIOS.cpp:
(WebKit::AuxiliaryProcess::populateMobileGestaltCache):
* Source/WebKit/UIProcess/AuxiliaryProcessProxy.cpp:
(WebKit::AuxiliaryProcessProxy::createMobileGestaltSandboxExtensionIfNeeded const):
* Source/WebKit/UIProcess/AuxiliaryProcessProxy.h:
* Source/WebKit/UIProcess/Cocoa/GPUProcessProxyCocoa.mm:
(WebKit::GPUProcessProxy::platformInitializeGPUProcessParameters):
* Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::platformInitializeWebProcess):
* Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::WebProcess::platformInitializeWebProcess):

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

Modified Paths

Diff

Modified: trunk/Source/WebKit/GPUProcess/GPUProcess.cpp (295086 => 295087)


--- trunk/Source/WebKit/GPUProcess/GPUProcess.cpp	2022-06-01 11:29:56 UTC (rev 295086)
+++ trunk/Source/WebKit/GPUProcess/GPUProcess.cpp	2022-06-01 15:04:44 UTC (rev 295087)
@@ -265,6 +265,8 @@
     SandboxExtension::consumePermanently(parameters.dynamicIOKitExtensionHandles);
 #endif
 
+    populateMobileGestaltCache(WTFMove(parameters.mobileGestaltExtensionHandle));
+
 #if HAVE(CGIMAGESOURCE_WITH_SET_ALLOWABLE_TYPES)
     auto emptyArray = adoptCF(CFArrayCreate(kCFAllocatorDefault, nullptr, 0, &kCFTypeArrayCallBacks));
     CGImageSourceSetAllowableTypes(emptyArray.get());

Modified: trunk/Source/WebKit/GPUProcess/GPUProcessCreationParameters.cpp (295086 => 295087)


--- trunk/Source/WebKit/GPUProcess/GPUProcessCreationParameters.cpp	2022-06-01 11:29:56 UTC (rev 295086)
+++ trunk/Source/WebKit/GPUProcess/GPUProcessCreationParameters.cpp	2022-06-01 15:04:44 UTC (rev 295087)
@@ -61,6 +61,7 @@
     encoder << compilerServiceExtensionHandles;
     encoder << dynamicIOKitExtensionHandles;
 #endif
+    encoder << mobileGestaltExtensionHandle;
 
     encoder << applicationVisibleName;
 }
@@ -112,6 +113,12 @@
     result.dynamicIOKitExtensionHandles = WTFMove(*dynamicIOKitExtensionHandles);
 #endif
 
+    std::optional<std::optional<SandboxExtension::Handle>> mobileGestaltExtensionHandle;
+    decoder >> mobileGestaltExtensionHandle;
+    if (!mobileGestaltExtensionHandle)
+        return false;
+    result.mobileGestaltExtensionHandle = WTFMove(*mobileGestaltExtensionHandle);
+
     if (!decoder.decode(result.applicationVisibleName))
         return false;
 

Modified: trunk/Source/WebKit/GPUProcess/GPUProcessCreationParameters.h (295086 => 295087)


--- trunk/Source/WebKit/GPUProcess/GPUProcessCreationParameters.h	2022-06-01 11:29:56 UTC (rev 295086)
+++ trunk/Source/WebKit/GPUProcess/GPUProcessCreationParameters.h	2022-06-01 15:04:44 UTC (rev 295087)
@@ -61,6 +61,7 @@
     Vector<SandboxExtension::Handle> compilerServiceExtensionHandles;
     Vector<SandboxExtension::Handle> dynamicIOKitExtensionHandles;
 #endif
+    std::optional<SandboxExtension::Handle> mobileGestaltExtensionHandle;
 
     String applicationVisibleName;
 

Modified: trunk/Source/WebKit/Resources/SandboxProfiles/ios/com.apple.WebKit.GPU.sb.in (295086 => 295087)


--- trunk/Source/WebKit/Resources/SandboxProfiles/ios/com.apple.WebKit.GPU.sb.in	2022-06-01 11:29:56 UTC (rev 295086)
+++ trunk/Source/WebKit/Resources/SandboxProfiles/ios/com.apple.WebKit.GPU.sb.in	2022-06-01 15:04:44 UTC (rev 295087)
@@ -401,6 +401,11 @@
 (allow mach-lookup (with telemetry)
     (global-name "com.apple.tccd"))
 
+(allow mach-lookup
+    (require-all
+        (extension "com.apple.webkit.extension.mach")
+        (global-name "com.apple.mobilegestalt.xpc")))
+
 ;; <rdar://problem/12413942>
 (allow file-read*
        (well-known-system-group-container-literal "/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist"))

Modified: trunk/Source/WebKit/Shared/AuxiliaryProcess.cpp (295086 => 295087)


--- trunk/Source/WebKit/Shared/AuxiliaryProcess.cpp	2022-06-01 11:29:56 UTC (rev 295086)
+++ trunk/Source/WebKit/Shared/AuxiliaryProcess.cpp	2022-06-01 15:04:44 UTC (rev 295087)
@@ -218,6 +218,12 @@
 #endif
 }
 
+#if !PLATFORM(IOS_FAMILY) || PLATFORM(MACCATALYST)
+void AuxiliaryProcess::populateMobileGestaltCache(std::optional<SandboxExtension::Handle>&&)
+{
+}
+#endif
+
 #if !PLATFORM(COCOA)
 
 #if !OS(UNIX)

Modified: trunk/Source/WebKit/Shared/AuxiliaryProcess.h (295086 => 295087)


--- trunk/Source/WebKit/Shared/AuxiliaryProcess.h	2022-06-01 11:29:56 UTC (rev 295086)
+++ trunk/Source/WebKit/Shared/AuxiliaryProcess.h	2022-06-01 15:04:44 UTC (rev 295087)
@@ -150,6 +150,8 @@
     void openDirectoryCacheInvalidated(SandboxExtension::Handle&&);
 #endif
 
+    void populateMobileGestaltCache(std::optional<SandboxExtension::Handle>&& mobileGestaltExtensionHandle);
+
 private:
     virtual bool shouldOverrideQuarantine() { return true; }
 

Modified: trunk/Source/WebKit/Shared/ios/AuxiliaryProcessIOS.mm (295086 => 295087)


--- trunk/Source/WebKit/Shared/ios/AuxiliaryProcessIOS.mm	2022-06-01 11:29:56 UTC (rev 295086)
+++ trunk/Source/WebKit/Shared/ios/AuxiliaryProcessIOS.mm	2022-06-01 15:04:44 UTC (rev 295087)
@@ -34,6 +34,7 @@
 #import <WebCore/SystemVersion.h>
 #import <mach/mach.h>
 #import <mach/task.h>
+#import <pal/spi/ios/MobileGestaltSPI.h>
 #import <pwd.h>
 #import <stdlib.h>
 #import <sysexits.h>
@@ -51,6 +52,43 @@
 
 }
 
+void AuxiliaryProcess::populateMobileGestaltCache(std::optional<SandboxExtension::Handle>&& mobileGestaltExtensionHandle)
+{
+    if (!mobileGestaltExtensionHandle)
+        return;
+
+    if (auto extension = SandboxExtension::create(WTFMove(*mobileGestaltExtensionHandle))) {
+        bool ok = extension->consume();
+        ASSERT_UNUSED(ok, ok);
+        // If we have an extension handle for MobileGestalt, it means the MobileGestalt cache is invalid.
+        // In this case, we perform a set of MobileGestalt queries while having access to the daemon,
+        // which will populate the MobileGestalt in-memory cache with correct values.
+        // The set of queries below was determined by finding all possible queries that have cachable
+        // values, and would reach out to the daemon for the answer. That way, the in-memory cache
+        // should be identical to a valid MobileGestalt cache after having queried all of these values.
+        MGGetFloat32Answer(kMGQMainScreenScale, 0);
+        MGGetSInt32Answer(kMGQMainScreenPitch, 0);
+        MGGetSInt32Answer(kMGQMainScreenClass, MGScreenClassPad2);
+        MGGetBoolAnswer(kMGQAppleInternalInstallCapability);
+        MGGetBoolAnswer(kMGQiPadCapability);
+        auto deviceName = adoptCF(MGCopyAnswer(kMGQDeviceName, nullptr));
+        MGGetSInt32Answer(kMGQDeviceClassNumber, MGDeviceClassInvalid);
+        MGGetBoolAnswer(kMGQHasExtendedColorDisplay);
+        MGGetFloat32Answer(kMGQDeviceCornerRadius, 0);
+        MGGetBoolAnswer(kMGQSupportsForceTouch);
+
+        auto answer = adoptCF(MGCopyAnswer(kMGQBluetoothCapability, nullptr));
+        answer = MGCopyAnswer(kMGQDeviceProximityCapability, nullptr);
+        answer = MGCopyAnswer(kMGQDeviceSupportsARKit, nullptr);
+        answer = MGCopyAnswer(kMGQTimeSyncCapability, nullptr);
+        answer = MGCopyAnswer(kMGQWAPICapability, nullptr);
+        answer = MGCopyAnswer(kMGQMainDisplayRotation, nullptr);
+
+        ok = extension->revoke();
+        ASSERT_UNUSED(ok, ok);
+    }
+}
+
 } // namespace WebKit
 
 #endif

Modified: trunk/Source/WebKit/UIProcess/AuxiliaryProcessProxy.cpp (295086 => 295087)


--- trunk/Source/WebKit/UIProcess/AuxiliaryProcessProxy.cpp	2022-06-01 11:29:56 UTC (rev 295086)
+++ trunk/Source/WebKit/UIProcess/AuxiliaryProcessProxy.cpp	2022-06-01 15:04:44 UTC (rev 295087)
@@ -39,6 +39,10 @@
 #include <wtf/spi/darwin/SandboxSPI.h>
 #endif
 
+#if PLATFORM(IOS_FAMILY) && !PLATFORM(MACCATALYST)
+#import <pal/spi/ios/MobileGestaltSPI.h>
+#endif
+
 namespace WebKit {
 
 AuxiliaryProcessProxy::AuxiliaryProcessProxy(bool alwaysRunsAtBackgroundPriority, Seconds responsivenessTimeout)
@@ -418,4 +422,18 @@
     return parameters;
 }
 
+std::optional<SandboxExtension::Handle> AuxiliaryProcessProxy::createMobileGestaltSandboxExtensionIfNeeded() const
+{
+#if PLATFORM(IOS_FAMILY) && !PLATFORM(MACCATALYST)
+    if (_MGCacheValid())
+        return std::nullopt;
+    
+    RELEASE_LOG_FAULT(Sandbox, "MobileGestalt cache is invalid! Creating a sandbox extension to repopulate cache in memory.");
+
+    return SandboxExtension::createHandleForMachLookup("com.apple.mobilegestalt.xpc"_s, std::nullopt);
+#else
+    return std::nullopt;
+#endif
+}
+
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/AuxiliaryProcessProxy.h (295086 => 295087)


--- trunk/Source/WebKit/UIProcess/AuxiliaryProcessProxy.h	2022-06-01 11:29:56 UTC (rev 295086)
+++ trunk/Source/WebKit/UIProcess/AuxiliaryProcessProxy.h	2022-06-01 15:04:44 UTC (rev 295087)
@@ -30,6 +30,7 @@
 #include "MessageReceiverMap.h"
 #include "ProcessLauncher.h"
 #include "ResponsivenessTimer.h"
+#include "SandboxExtension.h"
 #include <WebCore/ProcessIdentifier.h>
 #include <wtf/ProcessID.h>
 #include <wtf/SystemTracing.h>
@@ -144,6 +145,8 @@
     void ref() final { ThreadSafeRefCounted::ref(); }
     void deref() final { ThreadSafeRefCounted::deref(); }
 
+    std::optional<SandboxExtension::Handle> createMobileGestaltSandboxExtensionIfNeeded() const;
+
 protected:
     // ProcessLauncher::Client
     void didFinishLaunching(ProcessLauncher*, IPC::Connection::Identifier) override;

Modified: trunk/Source/WebKit/UIProcess/Cocoa/GPUProcessProxyCocoa.mm (295086 => 295087)


--- trunk/Source/WebKit/UIProcess/Cocoa/GPUProcessProxyCocoa.mm	2022-06-01 11:29:56 UTC (rev 295086)
+++ trunk/Source/WebKit/UIProcess/Cocoa/GPUProcessProxyCocoa.mm	2022-06-01 15:04:44 UTC (rev 295087)
@@ -35,6 +35,7 @@
 
 void GPUProcessProxy::platformInitializeGPUProcessParameters(GPUProcessCreationParameters& parameters)
 {
+    parameters.mobileGestaltExtensionHandle = createMobileGestaltSandboxExtensionIfNeeded();
     parameters.applicationVisibleName = applicationVisibleName();
 }
 

Modified: trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm (295086 => 295087)


--- trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2022-06-01 11:29:56 UTC (rev 295086)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm	2022-06-01 15:04:44 UTC (rev 295087)
@@ -384,12 +384,7 @@
     parameters.contentSizeCategory = RenderThemeCocoa::singleton().contentSizeCategory();
 #endif
 
-#if PLATFORM(IOS_FAMILY) && !PLATFORM(MACCATALYST)
-    if (!_MGCacheValid()) {
-        if (auto handle = SandboxExtension::createHandleForMachLookup("com.apple.mobilegestalt.xpc"_s, std::nullopt))
-            parameters.mobileGestaltExtensionHandle = WTFMove(*handle);
-    }
-#endif
+    parameters.mobileGestaltExtensionHandle = process.createMobileGestaltSandboxExtensionIfNeeded();
 
 #if PLATFORM(MAC)
     if (auto launchServicesExtensionHandle = SandboxExtension::createHandleForMachLookup("com.apple.coreservices.launchservicesd"_s, std::nullopt))

Modified: trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm (295086 => 295087)


--- trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2022-06-01 11:29:56 UTC (rev 295086)
+++ trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2022-06-01 15:04:44 UTC (rev 295087)
@@ -127,7 +127,6 @@
 #import <MobileCoreServices/MobileCoreServices.h>
 #import <UIKit/UIAccessibility.h>
 #import <pal/spi/ios/GraphicsServicesSPI.h>
-#import <pal/spi/ios/MobileGestaltSPI.h>
 #endif
 
 #if PLATFORM(IOS_FAMILY) && USE(APPLE_INTERNAL_SDK)
@@ -238,40 +237,8 @@
     }
 #endif
 
-    if (parameters.mobileGestaltExtensionHandle) {
-        if (auto extension = SandboxExtension::create(WTFMove(*parameters.mobileGestaltExtensionHandle))) {
-            bool ok = extension->consume();
-            ASSERT_UNUSED(ok, ok);
-            // If we have an extension handle for MobileGestalt, it means the MobileGestalt cache is invalid.
-            // In this case, we perform a set of MobileGestalt queries while having access to the daemon,
-            // which will populate the MobileGestalt in-memory cache with correct values.
-            // The set of queries below was determined by finding all possible queries that have cachable
-            // values, and would reach out to the daemon for the answer. That way, the in-memory cache
-            // should be identical to a valid MobileGestalt cache after having queried all of these values.
-#if PLATFORM(IOS_FAMILY) && !PLATFORM(MACCATALYST)
-            MGGetFloat32Answer(kMGQMainScreenScale, 0);
-            MGGetSInt32Answer(kMGQMainScreenPitch, 0);
-            MGGetSInt32Answer(kMGQMainScreenClass, MGScreenClassPad2);
-            MGGetBoolAnswer(kMGQAppleInternalInstallCapability);
-            MGGetBoolAnswer(kMGQiPadCapability);
-            auto deviceName = adoptCF(MGCopyAnswer(kMGQDeviceName, nullptr));
-            MGGetSInt32Answer(kMGQDeviceClassNumber, MGDeviceClassInvalid);
-            MGGetBoolAnswer(kMGQHasExtendedColorDisplay);
-            MGGetFloat32Answer(kMGQDeviceCornerRadius, 0);
-            MGGetBoolAnswer(kMGQSupportsForceTouch);
+    populateMobileGestaltCache(WTFMove(parameters.mobileGestaltExtensionHandle));
 
-            auto answer = adoptCF(MGCopyAnswer(kMGQBluetoothCapability, nullptr));
-            answer = MGCopyAnswer(kMGQDeviceProximityCapability, nullptr);
-            answer = MGCopyAnswer(kMGQDeviceSupportsARKit, nullptr);
-            answer = MGCopyAnswer(kMGQTimeSyncCapability, nullptr);
-            answer = MGCopyAnswer(kMGQWAPICapability, nullptr);
-            answer = MGCopyAnswer(kMGQMainDisplayRotation, nullptr);
-#endif
-            ok = extension->revoke();
-            ASSERT_UNUSED(ok, ok);
-        }
-    }
-
     m_uiProcessBundleIdentifier = parameters.uiProcessBundleIdentifier;
 
 #if ENABLE(SANDBOX_EXTENSIONS)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to