Loading a file URL and then issuing a reload right away causes the load to fail due...
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 27 Jul 2018 01:50:08 +0000 (01:50 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 27 Jul 2018 01:50:08 +0000 (01:50 +0000)
commit39155402d87e52b8536cb87cab260009047441ed
treee023ab08547d9c4aa10662df087ced384f48c203
parentfe221ca989052267fa249d2494bd0096bc0b30d5
Loading a file URL and then issuing a reload right away causes the load to fail due to sandboxing
https://bugs.webkit.org/show_bug.cgi?id=188078
<rdar://problem/42562493>

Reviewed by Geoff Garen.

Source/WebKit:

When WebPageProxy::loadFile() is called, we create a SandboxExtension::Handle for the resource path provided
by the caller and pass it to the WebProcess. WebPage::loadRequest() then calls SandboxExtensionTracker::beginLoad()
to store this handle in m_provisionalSandboxExtension for later consumption.

If a reload is issued before this sandbox extension has been consumed, then the following happens:
1. WebPageProxy::reload() does NOT create a SandboxExtension::Handle because it has already issued one earlier.
   maybeInitializeSandboxExtensionHandle() returns early due to m_process->hasAssumedReadAccessToURL(url) check.
2. WebPage::reload() then calls SandboxExtensionTracker::beginLoad() with a null handle, which overwrites the
   previous m_provisionalSandboxExtension its needs.
3. The load fails because the WebContent process is missing the sandbox extension.

To address the issue, SandboxExtensionTracker::beginLoad() is updated to only overwrite m_provisionalSandboxExtension
if the new handle is not null. This avoids inadvertently clearing a valid sandbox extension we may need for the load,
since the UIProcess sends us a null handle if it previously sent us a sandbox extension for the path in question.

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::SandboxExtensionTracker::beginLoad):

Tools:

Add API test coverage. It exercises the right code path but unfortunately is not yet a regression
test because TestWebKitAPI does not appear to be sandboxed (rdar://problem/42638129).

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKitCocoa/LoadFileThenReload.mm: Added.
(-[LoadFileThenReloadDelegate webView:didFinishNavigation:]):
(-[LoadFileThenReloadDelegate webView:didFailProvisionalNavigation:withError:]):
(-[LoadFileThenReloadDelegate webView:didFailNavigation:withError:]):
(TEST):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@234290 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/WebKit/ChangeLog
Source/WebKit/WebProcess/WebPage/WebPage.cpp
Tools/ChangeLog
Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
Tools/TestWebKitAPI/Tests/WebKitCocoa/LoadFileThenReload.mm [new file with mode: 0644]