Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/frame_host/render_frame_host_impl.h" | 5 #include "content/browser/frame_host/render_frame_host_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 915 RenderProcessHost* process = GetProcess(); | 915 RenderProcessHost* process = GetProcess(); |
| 916 | 916 |
| 917 // Read the parameters out of the IPC message directly to avoid making another | 917 // Read the parameters out of the IPC message directly to avoid making another |
| 918 // copy when we filter the URLs. | 918 // copy when we filter the URLs. |
| 919 base::PickleIterator iter(msg); | 919 base::PickleIterator iter(msg); |
| 920 FrameHostMsg_DidCommitProvisionalLoad_Params validated_params; | 920 FrameHostMsg_DidCommitProvisionalLoad_Params validated_params; |
| 921 if (!IPC::ParamTraits<FrameHostMsg_DidCommitProvisionalLoad_Params>:: | 921 if (!IPC::ParamTraits<FrameHostMsg_DidCommitProvisionalLoad_Params>:: |
| 922 Read(&msg, &iter, &validated_params)) { | 922 Read(&msg, &iter, &validated_params)) { |
| 923 bad_message::ReceivedBadMessage( | 923 bad_message::ReceivedBadMessage( |
| 924 process, bad_message::RFH_COMMIT_DESERIALIZATION_FAILED); | 924 process, bad_message::RFH_COMMIT_DESERIALIZATION_FAILED); |
| 925 // PlzNavigate: release the stream now that the renderer is going away. | |
| 926 stream_handle_.reset(); | |
| 925 return; | 927 return; |
| 926 } | 928 } |
| 927 TRACE_EVENT1("navigation", "RenderFrameHostImpl::OnDidCommitProvisionalLoad", | 929 TRACE_EVENT1("navigation", "RenderFrameHostImpl::OnDidCommitProvisionalLoad", |
| 928 "url", validated_params.url.possibly_invalid_spec()); | 930 "url", validated_params.url.possibly_invalid_spec()); |
| 929 | 931 |
| 930 // Sanity-check the page transition for frame type. | 932 // Sanity-check the page transition for frame type. |
| 931 DCHECK_EQ(ui::PageTransitionIsMainFrame(validated_params.transition), | 933 DCHECK_EQ(ui::PageTransitionIsMainFrame(validated_params.transition), |
| 932 !GetParent()); | 934 !GetParent()); |
| 933 | 935 |
| 934 // If we're waiting for a cross-site beforeunload ack from this renderer and | 936 // If we're waiting for a cross-site beforeunload ack from this renderer and |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 969 | 971 |
| 970 // Attempts to commit certain off-limits URL should be caught more strictly | 972 // Attempts to commit certain off-limits URL should be caught more strictly |
| 971 // than our FilterURL checks below. If a renderer violates this policy, it | 973 // than our FilterURL checks below. If a renderer violates this policy, it |
| 972 // should be killed. | 974 // should be killed. |
| 973 if (!CanCommitURL(validated_params.url)) { | 975 if (!CanCommitURL(validated_params.url)) { |
| 974 VLOG(1) << "Blocked URL " << validated_params.url.spec(); | 976 VLOG(1) << "Blocked URL " << validated_params.url.spec(); |
| 975 validated_params.url = GURL(url::kAboutBlankURL); | 977 validated_params.url = GURL(url::kAboutBlankURL); |
| 976 // Kills the process. | 978 // Kills the process. |
| 977 bad_message::ReceivedBadMessage(process, | 979 bad_message::ReceivedBadMessage(process, |
| 978 bad_message::RFH_CAN_COMMIT_URL_BLOCKED); | 980 bad_message::RFH_CAN_COMMIT_URL_BLOCKED); |
| 981 // PlzNavigate: release the stream now that the renderer is going away. | |
| 982 stream_handle_.reset(); | |
| 979 return; | 983 return; |
| 980 } | 984 } |
| 981 | 985 |
| 982 // Verify that the origin passed from the renderer process is valid and can | 986 // Verify that the origin passed from the renderer process is valid and can |
| 983 // be allowed to commit in this RenderFrameHost. | 987 // be allowed to commit in this RenderFrameHost. |
| 984 if (!CanCommitOrigin(validated_params.origin, validated_params.url)) { | 988 if (!CanCommitOrigin(validated_params.origin, validated_params.url)) { |
| 985 bad_message::ReceivedBadMessage(GetProcess(), | 989 bad_message::ReceivedBadMessage(GetProcess(), |
| 986 bad_message::RFH_INVALID_ORIGIN_ON_COMMIT); | 990 bad_message::RFH_INVALID_ORIGIN_ON_COMMIT); |
| 991 // PlzNavigate: release the stream now that the renderer is going away. | |
| 992 stream_handle_.reset(); | |
| 987 return; | 993 return; |
| 988 } | 994 } |
| 989 | 995 |
| 990 // Without this check, an evil renderer can trick the browser into creating | 996 // Without this check, an evil renderer can trick the browser into creating |
| 991 // a navigation entry for a banned URL. If the user clicks the back button | 997 // a navigation entry for a banned URL. If the user clicks the back button |
| 992 // followed by the forward button (or clicks reload, or round-trips through | 998 // followed by the forward button (or clicks reload, or round-trips through |
| 993 // session restore, etc), we'll think that the browser commanded the | 999 // session restore, etc), we'll think that the browser commanded the |
| 994 // renderer to load the URL and grant the renderer the privileges to request | 1000 // renderer to load the URL and grant the renderer the privileges to request |
| 995 // the URL. To prevent this attack, we block the renderer from inserting | 1001 // the URL. To prevent this attack, we block the renderer from inserting |
| 996 // banned URLs into the navigation controller in the first place. | 1002 // banned URLs into the navigation controller in the first place. |
| 997 process->FilterURL(false, &validated_params.url); | 1003 process->FilterURL(false, &validated_params.url); |
| 998 process->FilterURL(true, &validated_params.referrer.url); | 1004 process->FilterURL(true, &validated_params.referrer.url); |
| 999 for (std::vector<GURL>::iterator it(validated_params.redirects.begin()); | 1005 for (std::vector<GURL>::iterator it(validated_params.redirects.begin()); |
| 1000 it != validated_params.redirects.end(); ++it) { | 1006 it != validated_params.redirects.end(); ++it) { |
| 1001 process->FilterURL(false, &(*it)); | 1007 process->FilterURL(false, &(*it)); |
| 1002 } | 1008 } |
| 1003 process->FilterURL(true, &validated_params.searchable_form_url); | 1009 process->FilterURL(true, &validated_params.searchable_form_url); |
| 1004 | 1010 |
| 1005 // Without this check, the renderer can trick the browser into using | 1011 // Without this check, the renderer can trick the browser into using |
| 1006 // filenames it can't access in a future session restore. | 1012 // filenames it can't access in a future session restore. |
| 1007 if (!render_view_host_->CanAccessFilesOfPageState( | 1013 if (!render_view_host_->CanAccessFilesOfPageState( |
| 1008 validated_params.page_state)) { | 1014 validated_params.page_state)) { |
| 1009 bad_message::ReceivedBadMessage( | 1015 bad_message::ReceivedBadMessage( |
| 1010 GetProcess(), bad_message::RFH_CAN_ACCESS_FILES_OF_PAGE_STATE); | 1016 GetProcess(), bad_message::RFH_CAN_ACCESS_FILES_OF_PAGE_STATE); |
| 1017 // PlzNavigate: release the stream now that the renderer is going away. | |
| 1018 stream_handle_.reset(); | |
|
nasko
2016/03/18 20:41:14
Instead of putting these in all cases where we kil
clamy
2016/03/22 16:46:55
Actually we already do (in the SiteInstance versio
| |
| 1011 return; | 1019 return; |
| 1012 } | 1020 } |
| 1013 | 1021 |
| 1014 // If the URL does not match what the NavigationHandle expects, treat the | 1022 // If the URL does not match what the NavigationHandle expects, treat the |
| 1015 // commit as a new navigation. This can happen if an ongoing slow | 1023 // commit as a new navigation. This can happen if an ongoing slow |
| 1016 // same-process navigation is interrupted by a synchronous renderer-initiated | 1024 // same-process navigation is interrupted by a synchronous renderer-initiated |
| 1017 // navigation. | 1025 // navigation. |
| 1018 // TODO(csharrison): Data navigations loaded with LoadDataWithBaseURL get | 1026 // TODO(csharrison): Data navigations loaded with LoadDataWithBaseURL get |
| 1019 // reset here, because the NavigationHandle tracks the URL but the | 1027 // reset here, because the NavigationHandle tracks the URL but the |
| 1020 // validated_params.url tracks the data. The trick of saving the old entry ids | 1028 // validated_params.url tracks the data. The trick of saving the old entry ids |
| (...skipping 1676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2697 FrameTreeNode* focused_frame_tree_node = frame_tree_->GetFocusedFrame(); | 2705 FrameTreeNode* focused_frame_tree_node = frame_tree_->GetFocusedFrame(); |
| 2698 if (!focused_frame_tree_node) | 2706 if (!focused_frame_tree_node) |
| 2699 return; | 2707 return; |
| 2700 RenderFrameHostImpl* focused_frame = | 2708 RenderFrameHostImpl* focused_frame = |
| 2701 focused_frame_tree_node->current_frame_host(); | 2709 focused_frame_tree_node->current_frame_host(); |
| 2702 DCHECK(focused_frame); | 2710 DCHECK(focused_frame); |
| 2703 dst->focused_tree_id = focused_frame->GetAXTreeID(); | 2711 dst->focused_tree_id = focused_frame->GetAXTreeID(); |
| 2704 } | 2712 } |
| 2705 | 2713 |
| 2706 } // namespace content | 2714 } // namespace content |
| OLD | NEW |