Index: content/browser/service_worker/service_worker_database.cc |
diff --git a/content/browser/service_worker/service_worker_database.cc b/content/browser/service_worker/service_worker_database.cc |
index 35e64e97db2886772b92c148800e9518e830129d..fed2adb34adfa52af1c5408734bf41f9f92afd47 100644 |
--- a/content/browser/service_worker/service_worker_database.cc |
+++ b/content/browser/service_worker/service_worker_database.cc |
@@ -461,7 +461,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetRegistrationsForOrigin( |
if (opt_resources_list) { |
std::vector<ResourceRecord> resources; |
- status = ReadResourceRecords(registration.version_id, &resources); |
+ status = ReadResourceRecords(registration, &resources); |
if (status != STATUS_OK) { |
registrations->clear(); |
opt_resources_list->clear(); |
@@ -534,7 +534,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistration( |
if (status != STATUS_OK) |
return status; |
- status = ReadResourceRecords(value.version_id, resources); |
+ status = ReadResourceRecords(value, resources); |
if (status != STATUS_OK) |
return status; |
@@ -1265,13 +1265,14 @@ void ServiceWorkerDatabase::WriteRegistrationDataInBatch( |
} |
ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceRecords( |
- int64_t version_id, |
+ const RegistrationData& registration, |
std::vector<ResourceRecord>* resources) { |
DCHECK(resources->empty()); |
Status status = STATUS_OK; |
- const std::string prefix = CreateResourceRecordKeyPrefix(version_id); |
- |
+ bool has_main_resource = false; |
+ const std::string prefix = |
+ CreateResourceRecordKeyPrefix(registration.version_id); |
{ |
std::unique_ptr<leveldb::Iterator> itr( |
db_->NewIterator(leveldb::ReadOptions())); |
@@ -1291,10 +1292,22 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceRecords( |
resources->clear(); |
break; |
} |
+ |
+ if (registration.script == resource.url) { |
+ DCHECK(!has_main_resource); |
+ has_main_resource = true; |
+ } |
+ |
resources->push_back(resource); |
} |
} |
+ // |resources| should contain the main script. |
+ if (!has_main_resource) { |
+ resources->clear(); |
+ status = STATUS_ERROR_CORRUPTED; |
+ } |
+ |
HandleReadResult(FROM_HERE, status); |
return status; |
} |