Index: content/browser/loader/resource_dispatcher_host_impl.cc |
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc |
index d671e2b715abefdc166efd1417e480ffc84f137b..12a7f29ee7552568681b1cee694e371e25b2db80 100644 |
--- a/content/browser/loader/resource_dispatcher_host_impl.cc |
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc |
@@ -1170,6 +1170,23 @@ void ResourceDispatcherHostImpl::OnSyncLoad( |
sync_result->routing_id()); |
} |
+bool ResourceDispatcherHostImpl::IsRequestIDInUse( |
+ const GlobalRequestID& id) const { |
+ if (pending_loaders_.find(id) != pending_loaders_.end()) |
+ return true; |
+ for (BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.begin(); |
Charlie Reis
2016/01/28 22:05:16
nit: Maybe use C++11 range-based for loop here, si
gzobqq
2016/01/30 07:18:57
Done.
|
+ iter != blocked_loaders_map_.end(); ++iter) { |
+ BlockedLoadersList* loaders = iter->second; |
+ for (BlockedLoadersList::const_iterator loaders_iter = loaders->begin(); |
+ loaders_iter != loaders->end(); ++loaders_iter) { |
+ ResourceRequestInfoImpl* info = (*loaders_iter)->GetRequestInfo(); |
+ if (info->GetGlobalRequestID() == id) |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
void ResourceDispatcherHostImpl::UpdateRequestForTransfer( |
int child_id, |
int route_id, |
@@ -1254,6 +1271,14 @@ void ResourceDispatcherHostImpl::BeginRequest( |
int process_type = filter_->process_type(); |
int child_id = filter_->child_id(); |
+ // Reject request id that's currently in use. |
+ if (IsRequestIDInUse(GlobalRequestID(child_id, request_id))) { |
+ bad_message::ReceivedBadMessage( |
+ filter_, |
+ bad_message::RDH_INVALID_REQUEST_ID); |
+ return; |
+ } |
+ |
// PlzNavigate: reject invalid renderer main resource request. |
if (IsBrowserSideNavigationEnabled() && |
IsResourceTypeFrame(request_data.resource_type) && |