| Index: content/browser/frame_host/render_frame_host_impl.cc
|
| diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
|
| index 6c09ab90254ec0161fb9b0761bd830372c087c86..ef3248d34f4aece0f42cd8f0e7bc5f55b8733f1f 100644
|
| --- a/content/browser/frame_host/render_frame_host_impl.cc
|
| +++ b/content/browser/frame_host/render_frame_host_impl.cc
|
| @@ -21,7 +21,6 @@
|
| #include "content/browser/accessibility/browser_accessibility_state_impl.h"
|
| #include "content/browser/bluetooth/web_bluetooth_service_impl.h"
|
| #include "content/browser/child_process_security_policy_impl.h"
|
| -#include "content/browser/child_process_security_policy_impl.h"
|
| #include "content/browser/devtools/render_frame_devtools_agent_host.h"
|
| #include "content/browser/download/mhtml_generation_manager.h"
|
| #include "content/browser/frame_host/cross_process_frame_connector.h"
|
| @@ -161,6 +160,17 @@ class ScopedCommitStateResetter {
|
| bool disabled_;
|
| };
|
|
|
| +void GrantFileAccess(int child_id,
|
| + const std::vector<base::FilePath>& file_paths) {
|
| + ChildProcessSecurityPolicyImpl* policy =
|
| + ChildProcessSecurityPolicyImpl::GetInstance();
|
| +
|
| + for (const auto& file : file_paths) {
|
| + if (!policy->CanReadFile(child_id, file))
|
| + policy->GrantReadFile(child_id, file);
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| // static
|
| @@ -1085,8 +1095,7 @@ void RenderFrameHostImpl::OnDidCommitProvisionalLoad(const IPC::Message& msg) {
|
|
|
| // Without this check, the renderer can trick the browser into using
|
| // filenames it can't access in a future session restore.
|
| - if (!render_view_host_->CanAccessFilesOfPageState(
|
| - validated_params.page_state)) {
|
| + if (!CanAccessFilesOfPageState(validated_params.page_state)) {
|
| bad_message::ReceivedBadMessage(
|
| GetProcess(), bad_message::RFH_CAN_ACCESS_FILES_OF_PAGE_STATE);
|
| return;
|
| @@ -1177,8 +1186,7 @@ void RenderFrameHostImpl::OnUpdateState(const PageState& state) {
|
|
|
| // Without this check, the renderer can trick the browser into using
|
| // filenames it can't access in a future session restore.
|
| - // TODO(creis): Move CanAccessFilesOfPageState to RenderFrameHostImpl.
|
| - if (!render_view_host_->CanAccessFilesOfPageState(state)) {
|
| + if (!CanAccessFilesOfPageState(state)) {
|
| bad_message::ReceivedBadMessage(
|
| GetProcess(), bad_message::RFH_CAN_ACCESS_FILES_OF_PAGE_STATE);
|
| return;
|
| @@ -2757,16 +2765,18 @@ void RenderFrameHostImpl::DidUseGeolocationPermission() {
|
| ->last_committed_url().GetOrigin());
|
| }
|
|
|
| +bool RenderFrameHostImpl::CanAccessFilesOfPageState(const PageState& state) {
|
| + return ChildProcessSecurityPolicyImpl::GetInstance()->CanReadAllFiles(
|
| + GetProcess()->GetID(), state.GetReferencedFiles());
|
| +}
|
| +
|
| +void RenderFrameHostImpl::GrantFileAccessFromPageState(const PageState& state) {
|
| + GrantFileAccess(GetProcess()->GetID(), state.GetReferencedFiles());
|
| +}
|
| +
|
| void RenderFrameHostImpl::GrantFileAccessFromResourceRequestBody(
|
| const ResourceRequestBodyImpl& body) {
|
| - ChildProcessSecurityPolicyImpl* policy =
|
| - ChildProcessSecurityPolicyImpl::GetInstance();
|
| -
|
| - std::vector<base::FilePath> file_paths = body.GetReferencedFiles();
|
| - for (const auto& file : file_paths) {
|
| - if (!policy->CanReadFile(GetProcess()->GetID(), file))
|
| - policy->GrantReadFile(GetProcess()->GetID(), file);
|
| - }
|
| + GrantFileAccess(GetProcess()->GetID(), body.GetReferencedFiles());
|
| }
|
|
|
| void RenderFrameHostImpl::UpdatePermissionsForNavigation(
|
| @@ -2792,7 +2802,7 @@ void RenderFrameHostImpl::UpdatePermissionsForNavigation(
|
| // state are validated earlier, when they are received from the renderer (in
|
| // RenderFrameHostImpl::CanAccessFilesOfPageState).
|
| if (request_params.page_state.IsValid())
|
| - render_view_host_->GrantFileAccessFromPageState(request_params.page_state);
|
| + GrantFileAccessFromPageState(request_params.page_state);
|
|
|
| // We may be here after transferring navigation to a different renderer
|
| // process. In this case, we need to ensure that the new renderer retains
|
|
|