Chromium Code Reviews| 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 d41729388d925994851d023380672725d084666c..2947659f051f74d900b587527ec5db64ab179533 100644 |
| --- a/content/browser/loader/resource_dispatcher_host_impl.cc |
| +++ b/content/browser/loader/resource_dispatcher_host_impl.cc |
| @@ -1195,6 +1195,56 @@ void ResourceDispatcherHostImpl::UpdateRequestForTransfer( |
| } |
| } |
| +void ResourceDispatcherHostImpl::CompleteTransfer( |
| + int request_id, |
| + const ResourceRequest& request_data, |
| + int route_id) { |
| + // Caller should ensure that |request_data| is associated with a transfer. |
| + DCHECK(request_data.transferred_request_child_id != -1 || |
| + request_data.transferred_request_request_id != -1); |
| + |
| + bool is_navigational_request = |
| + request_data.resource_type == RESOURCE_TYPE_MAIN_FRAME || |
| + request_data.resource_type == RESOURCE_TYPE_SUB_FRAME; |
| + if (!is_navigational_request) { |
| + // Transfers apply only to navigational requests - the renderer seems to |
| + // have sent bogus IPC data. |
| + bad_message::ReceivedBadMessage( |
| + filter_, bad_message::RDH_TRANSFERRING_NONNAVIGATIONAL_REQUEST); |
| + return; |
| + } |
| + |
| + // Attempt to find a loader associated with the deferred transfer request. |
| + LoaderMap::iterator it = pending_loaders_.find( |
| + GlobalRequestID(request_data.transferred_request_child_id, |
| + request_data.transferred_request_request_id)); |
| + if (it == pending_loaders_.end()) { |
| + // Renderer sent transferred_request_request_id and/or |
| + // transferred_request_child_id that doesn't have a corresponding entry on |
| + // the browser side. |
| + bad_message::ReceivedBadMessage( |
| + filter_, bad_message::RDH_TRANSFERRING_REQUEST_NOT_FOUND); |
| + return; |
| + } |
| + ResourceLoader* pending_loader = it->second.get(); |
| + |
| + if (!pending_loader->is_transferring()) { |
| + // Renderer sent transferred_request_request_id and/or |
| + // transferred_request_child_id that doesn't correspond to an actually |
| + // transferring loader on the browser side. |
| + base::debug::Alias(pending_loader); |
| + bad_message::ReceivedBadMessage(filter_, |
| + bad_message::RDH_REQUEST_NOT_TRANSFERRING); |
| + return; |
| + } |
|
mmenke
2016/10/25 20:23:47
Random drive-by question: How concerned are we ab
Charlie Reis
2016/10/25 20:30:07
Yes, good point. Łukasz was asking about this the
|
| + |
| + // If the request is transferring to a new process, we can update our |
| + // state and let it resume with its existing ResourceHandlers. |
| + UpdateRequestForTransfer(filter_->child_id(), route_id, request_id, |
| + request_data, it); |
| + pending_loader->CompleteTransfer(); |
| +} |
| + |
| void ResourceDispatcherHostImpl::BeginRequest( |
| int request_id, |
| const ResourceRequest& request_data, |
| @@ -1239,24 +1289,12 @@ void ResourceDispatcherHostImpl::BeginRequest( |
| // If the request that's coming in is being transferred from another process, |
| // we want to reuse and resume the old loader rather than start a new one. |
| - LoaderMap::iterator it = pending_loaders_.find( |
| - GlobalRequestID(request_data.transferred_request_child_id, |
| - request_data.transferred_request_request_id)); |
| - if (it != pending_loaders_.end()) { |
| + if (request_data.transferred_request_child_id != -1 || |
| + request_data.transferred_request_request_id != -1) { |
| // TODO(yhirano): Make mojo work for this case. |
| DCHECK(!url_loader_client); |
| - // If the request is transferring to a new process, we can update our |
| - // state and let it resume with its existing ResourceHandlers. |
| - if (it->second->is_transferring()) { |
| - ResourceLoader* deferred_loader = it->second.get(); |
| - UpdateRequestForTransfer(child_id, route_id, request_id, |
| - request_data, it); |
| - deferred_loader->CompleteTransfer(); |
| - } else { |
| - bad_message::ReceivedBadMessage( |
| - filter_, bad_message::RDH_REQUEST_NOT_TRANSFERRING); |
| - } |
| + CompleteTransfer(request_id, request_data, route_id); |
| return; |
| } |