Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(411)

Side by Side Diff: content/browser/blob_storage/blob_dispatcher_host.cc

Issue 1913343002: [Blob] Removed crash on race case blob messages (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: whoops, checking url now instead. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/blob_storage/blob_dispatcher_host.h" 5 #include "content/browser/blob_storage/blob_dispatcher_host.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/metrics/histogram_macros.h" 10 #include "base/metrics/histogram_macros.h"
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 return; 212 return;
213 } 213 }
214 VLOG(1) << "Blob construction of " << uuid << " cancelled by renderer. " 214 VLOG(1) << "Blob construction of " << uuid << " cancelled by renderer. "
215 << " Reason: " << static_cast<int>(code) << "."; 215 << " Reason: " << static_cast<int>(code) << ".";
216 async_builder_.CancelBuildingBlob(uuid, code, context); 216 async_builder_.CancelBuildingBlob(uuid, code, context);
217 } 217 }
218 218
219 void BlobDispatcherHost::OnIncrementBlobRefCount(const std::string& uuid) { 219 void BlobDispatcherHost::OnIncrementBlobRefCount(const std::string& uuid) {
220 DCHECK_CURRENTLY_ON(BrowserThread::IO); 220 DCHECK_CURRENTLY_ON(BrowserThread::IO);
221 BlobStorageContext* context = this->context(); 221 BlobStorageContext* context = this->context();
222 if (uuid.empty() || !context->registry().HasEntry(uuid)) { 222 if (uuid.empty()) {
223 bad_message::ReceivedBadMessage(
224 this, bad_message::BDH_INVALID_REFCOUNT_OPERATION);
225 return;
226 }
227 if (!context->registry().HasEntry(uuid)) {
223 UMA_HISTOGRAM_ENUMERATION("Storage.Blob.InvalidReference", BDH_INCREMENT, 228 UMA_HISTOGRAM_ENUMERATION("Storage.Blob.InvalidReference", BDH_INCREMENT,
224 BDH_TRACING_ENUM_LAST); 229 BDH_TRACING_ENUM_LAST);
225 bad_message::ReceivedBadMessage(
226 this, bad_message::BDH_INVALID_REFCOUNT_OPERATION);
227 return; 230 return;
228 } 231 }
229 context->IncrementBlobRefCount(uuid); 232 context->IncrementBlobRefCount(uuid);
230 blobs_inuse_map_[uuid] += 1; 233 blobs_inuse_map_[uuid] += 1;
231 } 234 }
232 235
233 void BlobDispatcherHost::OnDecrementBlobRefCount(const std::string& uuid) { 236 void BlobDispatcherHost::OnDecrementBlobRefCount(const std::string& uuid) {
234 DCHECK_CURRENTLY_ON(BrowserThread::IO); 237 DCHECK_CURRENTLY_ON(BrowserThread::IO);
235 if (uuid.empty() || !IsInUseInHost(uuid)) { 238 if (uuid.empty()) {
239 bad_message::ReceivedBadMessage(
240 this, bad_message::BDH_INVALID_REFCOUNT_OPERATION);
241 return;
242 }
243 if (!IsInUseInHost(uuid)) {
236 UMA_HISTOGRAM_ENUMERATION("Storage.Blob.InvalidReference", BDH_DECREMENT, 244 UMA_HISTOGRAM_ENUMERATION("Storage.Blob.InvalidReference", BDH_DECREMENT,
237 BDH_TRACING_ENUM_LAST); 245 BDH_TRACING_ENUM_LAST);
238 bad_message::ReceivedBadMessage(
239 this, bad_message::BDH_INVALID_REFCOUNT_OPERATION);
240 return; 246 return;
241 } 247 }
242 BlobStorageContext* context = this->context(); 248 BlobStorageContext* context = this->context();
243 context->DecrementBlobRefCount(uuid); 249 context->DecrementBlobRefCount(uuid);
244 blobs_inuse_map_[uuid] -= 1; 250 blobs_inuse_map_[uuid] -= 1;
245 if (blobs_inuse_map_[uuid] == 0) { 251 if (blobs_inuse_map_[uuid] == 0) {
246 blobs_inuse_map_.erase(uuid); 252 blobs_inuse_map_.erase(uuid);
247 // If the blob has been deleted in the context and we're still building it, 253 // If the blob has been deleted in the context and we're still building it,
248 // this means we have no references waiting to read it. Clear the building 254 // this means we have no references waiting to read it. Clear the building
249 // state and send a cancel message to the renderer. 255 // state and send a cancel message to the renderer.
250 if (async_builder_.IsBeingBuilt(uuid) && 256 if (async_builder_.IsBeingBuilt(uuid) &&
251 !context->registry().HasEntry(uuid)) { 257 !context->registry().HasEntry(uuid)) {
252 async_builder_.CancelBuildingBlob( 258 async_builder_.CancelBuildingBlob(
253 uuid, IPCBlobCreationCancelCode::BLOB_DEREFERENCED_WHILE_BUILDING, 259 uuid, IPCBlobCreationCancelCode::BLOB_DEREFERENCED_WHILE_BUILDING,
254 context); 260 context);
255 Send(new BlobStorageMsg_CancelBuildingBlob( 261 Send(new BlobStorageMsg_CancelBuildingBlob(
256 uuid, IPCBlobCreationCancelCode::BLOB_DEREFERENCED_WHILE_BUILDING)); 262 uuid, IPCBlobCreationCancelCode::BLOB_DEREFERENCED_WHILE_BUILDING));
257 } 263 }
258 } 264 }
259 } 265 }
260 266
261 void BlobDispatcherHost::OnRegisterPublicBlobURL(const GURL& public_url, 267 void BlobDispatcherHost::OnRegisterPublicBlobURL(const GURL& public_url,
262 const std::string& uuid) { 268 const std::string& uuid) {
263 DCHECK_CURRENTLY_ON(BrowserThread::IO); 269 DCHECK_CURRENTLY_ON(BrowserThread::IO);
264 BlobStorageContext* context = this->context(); 270 BlobStorageContext* context = this->context();
265 if (uuid.empty() || !IsInUseInHost(uuid) || 271 if (uuid.empty()) {
266 context->registry().IsURLMapped(public_url)) { 272 bad_message::ReceivedBadMessage(this,
273 bad_message::BDH_INVALID_URL_OPERATION);
274 return;
275 }
276 if (!IsInUseInHost(uuid) || context->registry().IsURLMapped(public_url)) {
267 UMA_HISTOGRAM_ENUMERATION("Storage.Blob.InvalidURLRegister", BDH_INCREMENT, 277 UMA_HISTOGRAM_ENUMERATION("Storage.Blob.InvalidURLRegister", BDH_INCREMENT,
268 BDH_TRACING_ENUM_LAST); 278 BDH_TRACING_ENUM_LAST);
269 bad_message::ReceivedBadMessage(this,
270 bad_message::BDH_INVALID_URL_OPERATION);
271 return; 279 return;
272 } 280 }
273 context->RegisterPublicBlobURL(public_url, uuid); 281 context->RegisterPublicBlobURL(public_url, uuid);
274 public_blob_urls_.insert(public_url); 282 public_blob_urls_.insert(public_url);
275 } 283 }
276 284
277 void BlobDispatcherHost::OnRevokePublicBlobURL(const GURL& public_url) { 285 void BlobDispatcherHost::OnRevokePublicBlobURL(const GURL& public_url) {
278 DCHECK_CURRENTLY_ON(BrowserThread::IO); 286 DCHECK_CURRENTLY_ON(BrowserThread::IO);
279 if (!IsUrlRegisteredInHost(public_url)) { 287 if (!public_url.is_valid()) {
280 UMA_HISTOGRAM_ENUMERATION("Storage.Blob.InvalidURLRegister", BDH_DECREMENT,
281 BDH_TRACING_ENUM_LAST);
282 bad_message::ReceivedBadMessage(this, 288 bad_message::ReceivedBadMessage(this,
283 bad_message::BDH_INVALID_URL_OPERATION); 289 bad_message::BDH_INVALID_URL_OPERATION);
284 return; 290 return;
285 } 291 }
292 if (!IsUrlRegisteredInHost(public_url)) {
293 UMA_HISTOGRAM_ENUMERATION("Storage.Blob.InvalidURLRegister", BDH_DECREMENT,
294 BDH_TRACING_ENUM_LAST);
295 return;
296 }
286 context()->RevokePublicBlobURL(public_url); 297 context()->RevokePublicBlobURL(public_url);
287 public_blob_urls_.erase(public_url); 298 public_blob_urls_.erase(public_url);
288 } 299 }
289 300
290 storage::BlobStorageContext* BlobDispatcherHost::context() { 301 storage::BlobStorageContext* BlobDispatcherHost::context() {
291 return blob_storage_context_->context(); 302 return blob_storage_context_->context();
292 } 303 }
293 304
294 void BlobDispatcherHost::SendMemoryRequest( 305 void BlobDispatcherHost::SendMemoryRequest(
295 const std::string& uuid, 306 const std::string& uuid,
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 context->RevokePublicBlobURL(url); 361 context->RevokePublicBlobURL(url);
351 } 362 }
352 for (const auto& uuid_refnum_pair : blobs_inuse_map_) { 363 for (const auto& uuid_refnum_pair : blobs_inuse_map_) {
353 for (int i = 0; i < uuid_refnum_pair.second; ++i) 364 for (int i = 0; i < uuid_refnum_pair.second; ++i)
354 context->DecrementBlobRefCount(uuid_refnum_pair.first); 365 context->DecrementBlobRefCount(uuid_refnum_pair.first);
355 } 366 }
356 async_builder_.CancelAll(context); 367 async_builder_.CancelAll(context);
357 } 368 }
358 369
359 } // namespace content 370 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698