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

Side by Side Diff: third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp

Issue 2537303003: Fix memory corruption related to load blocking resource move (Closed)
Patch Set: Created 4 years 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 /* 1 /*
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
6 rights reserved. 6 rights reserved.
7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ 7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/
8 8
9 This library is free software; you can redistribute it and/or 9 This library is free software; you can redistribute it and/or
10 modify it under the terms of the GNU Library General Public 10 modify it under the terms of the GNU Library General Public
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 return resource; 444 return resource;
445 } 445 }
446 446
447 void ResourceFetcher::moveCachedNonBlockingResourceToBlocking( 447 void ResourceFetcher::moveCachedNonBlockingResourceToBlocking(
448 Resource* resource, 448 Resource* resource,
449 const FetchRequest& request) { 449 const FetchRequest& request) {
450 // TODO(yoav): Test that non-blocking resources (video/audio/track) continue 450 // TODO(yoav): Test that non-blocking resources (video/audio/track) continue
451 // to not-block even after being preloaded and discovered. 451 // to not-block even after being preloaded and discovered.
452 if (resource && resource->loader() && 452 if (resource && resource->loader() &&
453 resource->isLoadEventBlockingResourceType() && 453 resource->isLoadEventBlockingResourceType() &&
454 m_nonBlockingLoaders.contains(resource->loader()) &&
454 resource->isLinkPreload() && !request.forPreload()) { 455 resource->isLinkPreload() && !request.forPreload()) {
455 m_nonBlockingLoaders.remove(resource->loader()); 456 m_nonBlockingLoaders.remove(resource->loader());
456 m_loaders.add(resource->loader()); 457 m_loaders.add(resource->loader());
457 } 458 }
458 } 459 }
459 460
460 void ResourceFetcher::updateMemoryCacheStats(Resource* resource, 461 void ResourceFetcher::updateMemoryCacheStats(Resource* resource,
461 RevalidationPolicy policy, 462 RevalidationPolicy policy,
462 const FetchRequest& request, 463 const FetchRequest& request,
463 const ResourceFactory& factory, 464 const ResourceFactory& factory,
(...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after
1273 1274
1274 void ResourceFetcher::acceptDataFromThreadedReceiver(unsigned long identifier, 1275 void ResourceFetcher::acceptDataFromThreadedReceiver(unsigned long identifier,
1275 const char* data, 1276 const char* data,
1276 int dataLength, 1277 int dataLength,
1277 int encodedDataLength) { 1278 int encodedDataLength) {
1278 context().dispatchDidReceiveData(identifier, data, dataLength, 1279 context().dispatchDidReceiveData(identifier, data, dataLength,
1279 encodedDataLength); 1280 encodedDataLength);
1280 } 1281 }
1281 1282
1282 void ResourceFetcher::moveResourceLoaderToNonBlocking(ResourceLoader* loader) { 1283 void ResourceFetcher::moveResourceLoaderToNonBlocking(ResourceLoader* loader) {
1284 DCHECK(loader);
1283 m_nonBlockingLoaders.add(loader); 1285 m_nonBlockingLoaders.add(loader);
1284 m_loaders.remove(loader); 1286 m_loaders.remove(loader);
bokan 2016/11/30 14:52:42 Should we check that loader is in m_loaders here t
Yoav Weiss 2016/11/30 16:11:42 That makes sense. Not sure how to exercise that co
Charlie Harrison 2016/11/30 16:51:33 I think we can DCHECK, afaict.
bokan 2016/11/30 17:01:22 I would DCHECK and add an early return since other
1285 } 1287 }
1286 1288
1287 bool ResourceFetcher::startLoad(Resource* resource) { 1289 bool ResourceFetcher::startLoad(Resource* resource) {
1288 DCHECK(resource); 1290 DCHECK(resource);
1289 DCHECK(resource->stillNeedsLoad()); 1291 DCHECK(resource->stillNeedsLoad());
1290 if (!context().shouldLoadNewResource(resource->getType())) { 1292 if (!context().shouldLoadNewResource(resource->getType())) {
1291 memoryCache()->remove(resource); 1293 memoryCache()->remove(resource);
1292 return false; 1294 return false;
1293 } 1295 }
1294 1296
(...skipping 22 matching lines...) Expand all
1317 storeResourceTimingInitiatorInformation(resource); 1319 storeResourceTimingInitiatorInformation(resource);
1318 resource->setFetcherSecurityOrigin(sourceOrigin); 1320 resource->setFetcherSecurityOrigin(sourceOrigin);
1319 1321
1320 loader->activateCacheAwareLoadingIfNeeded(request); 1322 loader->activateCacheAwareLoadingIfNeeded(request);
1321 loader->start(request, context().loadingTaskRunner(), 1323 loader->start(request, context().loadingTaskRunner(),
1322 context().defersLoading()); 1324 context().defersLoading());
1323 return true; 1325 return true;
1324 } 1326 }
1325 1327
1326 void ResourceFetcher::removeResourceLoader(ResourceLoader* loader) { 1328 void ResourceFetcher::removeResourceLoader(ResourceLoader* loader) {
1329 DCHECK(loader);
1327 if (m_loaders.contains(loader)) 1330 if (m_loaders.contains(loader))
1328 m_loaders.remove(loader); 1331 m_loaders.remove(loader);
1329 else if (m_nonBlockingLoaders.contains(loader)) 1332 else if (m_nonBlockingLoaders.contains(loader))
1330 m_nonBlockingLoaders.remove(loader); 1333 m_nonBlockingLoaders.remove(loader);
1331 else 1334 else
1332 NOTREACHED(); 1335 NOTREACHED();
1333 } 1336 }
1334 1337
1335 void ResourceFetcher::stopFetching() { 1338 void ResourceFetcher::stopFetching() {
1336 HeapVector<Member<ResourceLoader>> loadersToCancel; 1339 HeapVector<Member<ResourceLoader>> loadersToCancel;
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
1641 visitor->trace(m_context); 1644 visitor->trace(m_context);
1642 visitor->trace(m_archive); 1645 visitor->trace(m_archive);
1643 visitor->trace(m_loaders); 1646 visitor->trace(m_loaders);
1644 visitor->trace(m_nonBlockingLoaders); 1647 visitor->trace(m_nonBlockingLoaders);
1645 visitor->trace(m_documentResources); 1648 visitor->trace(m_documentResources);
1646 visitor->trace(m_preloads); 1649 visitor->trace(m_preloads);
1647 visitor->trace(m_resourceTimingInfoMap); 1650 visitor->trace(m_resourceTimingInfoMap);
1648 } 1651 }
1649 1652
1650 } // namespace blink 1653 } // namespace blink
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