Commit cfde03da authored by Matt Falkenhagen's avatar Matt Falkenhagen Committed by Commit Bot

service worker: Add sequence checker to all database methods for safety.

Change-Id: I3f6c46258741591eaa49137608b3434aefa396a7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1782376
Commit-Queue: Matt Falkenhagen <falken@chromium.org>
Commit-Queue: Hiroki Nakagawa <nhiroki@chromium.org>
Auto-Submit: Matt Falkenhagen <falken@chromium.org>
Reviewed-by: default avatarHiroki Nakagawa <nhiroki@chromium.org>
Cr-Commit-Position: refs/heads/master@{#693027}
parent 074e9471
...@@ -1225,6 +1225,7 @@ ServiceWorkerDatabase::DeleteUserDataForAllRegistrationsByKeyPrefix( ...@@ -1225,6 +1225,7 @@ ServiceWorkerDatabase::DeleteUserDataForAllRegistrationsByKeyPrefix(
ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetUncommittedResourceIds( ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetUncommittedResourceIds(
std::set<int64_t>* ids) { std::set<int64_t>* ids) {
DCHECK(sequence_checker_.CalledOnValidSequence());
return ReadResourceIds(service_worker_internals::kUncommittedResIdKeyPrefix, return ReadResourceIds(service_worker_internals::kUncommittedResIdKeyPrefix,
ids); ids);
} }
...@@ -1232,6 +1233,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetUncommittedResourceIds( ...@@ -1232,6 +1233,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetUncommittedResourceIds(
ServiceWorkerDatabase::Status ServiceWorkerDatabase::Status
ServiceWorkerDatabase::WriteUncommittedResourceIds( ServiceWorkerDatabase::WriteUncommittedResourceIds(
const std::set<int64_t>& ids) { const std::set<int64_t>& ids) {
DCHECK(sequence_checker_.CalledOnValidSequence());
leveldb::WriteBatch batch; leveldb::WriteBatch batch;
Status status = WriteResourceIdsInBatch( Status status = WriteResourceIdsInBatch(
service_worker_internals::kUncommittedResIdKeyPrefix, ids, &batch); service_worker_internals::kUncommittedResIdKeyPrefix, ids, &batch);
...@@ -1242,12 +1244,14 @@ ServiceWorkerDatabase::WriteUncommittedResourceIds( ...@@ -1242,12 +1244,14 @@ ServiceWorkerDatabase::WriteUncommittedResourceIds(
ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetPurgeableResourceIds( ServiceWorkerDatabase::Status ServiceWorkerDatabase::GetPurgeableResourceIds(
std::set<int64_t>* ids) { std::set<int64_t>* ids) {
DCHECK(sequence_checker_.CalledOnValidSequence());
return ReadResourceIds(service_worker_internals::kPurgeableResIdKeyPrefix, return ReadResourceIds(service_worker_internals::kPurgeableResIdKeyPrefix,
ids); ids);
} }
ServiceWorkerDatabase::Status ServiceWorkerDatabase::ClearPurgeableResourceIds( ServiceWorkerDatabase::Status ServiceWorkerDatabase::ClearPurgeableResourceIds(
const std::set<int64_t>& ids) { const std::set<int64_t>& ids) {
DCHECK(sequence_checker_.CalledOnValidSequence());
Status status = LazyOpen(false); Status status = LazyOpen(false);
if (IsNewOrNonexistentDatabase(status)) if (IsNewOrNonexistentDatabase(status))
return STATUS_OK; return STATUS_OK;
...@@ -1263,6 +1267,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ClearPurgeableResourceIds( ...@@ -1263,6 +1267,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ClearPurgeableResourceIds(
ServiceWorkerDatabase::Status ServiceWorkerDatabase::Status
ServiceWorkerDatabase::PurgeUncommittedResourceIds( ServiceWorkerDatabase::PurgeUncommittedResourceIds(
const std::set<int64_t>& ids) { const std::set<int64_t>& ids) {
DCHECK(sequence_checker_.CalledOnValidSequence());
Status status = LazyOpen(false); Status status = LazyOpen(false);
if (IsNewOrNonexistentDatabase(status)) if (IsNewOrNonexistentDatabase(status))
return STATUS_OK; return STATUS_OK;
...@@ -1400,6 +1405,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::LazyOpen( ...@@ -1400,6 +1405,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::LazyOpen(
bool ServiceWorkerDatabase::IsNewOrNonexistentDatabase( bool ServiceWorkerDatabase::IsNewOrNonexistentDatabase(
ServiceWorkerDatabase::Status status) { ServiceWorkerDatabase::Status status) {
DCHECK(sequence_checker_.CalledOnValidSequence());
if (status == STATUS_ERROR_NOT_FOUND) if (status == STATUS_ERROR_NOT_FOUND)
return true; return true;
if (status == STATUS_OK && state_ == DATABASE_STATE_UNINITIALIZED) if (status == STATUS_OK && state_ == DATABASE_STATE_UNINITIALIZED)
...@@ -1410,6 +1416,7 @@ bool ServiceWorkerDatabase::IsNewOrNonexistentDatabase( ...@@ -1410,6 +1416,7 @@ bool ServiceWorkerDatabase::IsNewOrNonexistentDatabase(
ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadNextAvailableId( ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadNextAvailableId(
const char* id_key, const char* id_key,
int64_t* next_avail_id) { int64_t* next_avail_id) {
DCHECK(sequence_checker_.CalledOnValidSequence());
DCHECK(id_key); DCHECK(id_key);
DCHECK(next_avail_id); DCHECK(next_avail_id);
...@@ -1435,6 +1442,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationData( ...@@ -1435,6 +1442,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationData(
int64_t registration_id, int64_t registration_id,
const GURL& origin, const GURL& origin,
RegistrationData* registration) { RegistrationData* registration) {
DCHECK(sequence_checker_.CalledOnValidSequence());
DCHECK(registration); DCHECK(registration);
const std::string key = CreateRegistrationKey(registration_id, origin); const std::string key = CreateRegistrationKey(registration_id, origin);
...@@ -1456,6 +1464,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationData( ...@@ -1456,6 +1464,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadRegistrationData(
ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseRegistrationData( ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseRegistrationData(
const std::string& serialized, const std::string& serialized,
RegistrationData* out) { RegistrationData* out) {
DCHECK(sequence_checker_.CalledOnValidSequence());
DCHECK(out); DCHECK(out);
ServiceWorkerRegistrationData data; ServiceWorkerRegistrationData data;
if (!data.ParseFromString(serialized)) if (!data.ParseFromString(serialized))
...@@ -1550,6 +1559,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseRegistrationData( ...@@ -1550,6 +1559,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseRegistrationData(
void ServiceWorkerDatabase::WriteRegistrationDataInBatch( void ServiceWorkerDatabase::WriteRegistrationDataInBatch(
const RegistrationData& registration, const RegistrationData& registration,
leveldb::WriteBatch* batch) { leveldb::WriteBatch* batch) {
DCHECK(sequence_checker_.CalledOnValidSequence());
DCHECK(batch); DCHECK(batch);
// The registration id and version id should be bumped before this. // The registration id and version id should be bumped before this.
...@@ -1605,6 +1615,7 @@ void ServiceWorkerDatabase::WriteRegistrationDataInBatch( ...@@ -1605,6 +1615,7 @@ void ServiceWorkerDatabase::WriteRegistrationDataInBatch(
ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceRecords( ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceRecords(
const RegistrationData& registration, const RegistrationData& registration,
std::vector<ResourceRecord>* resources) { std::vector<ResourceRecord>* resources) {
DCHECK(sequence_checker_.CalledOnValidSequence());
DCHECK(resources->empty()); DCHECK(resources->empty());
Status status = STATUS_OK; Status status = STATUS_OK;
...@@ -1653,6 +1664,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceRecords( ...@@ -1653,6 +1664,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadResourceRecords(
ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseResourceRecord( ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseResourceRecord(
const std::string& serialized, const std::string& serialized,
ServiceWorkerDatabase::ResourceRecord* out) { ServiceWorkerDatabase::ResourceRecord* out) {
DCHECK(sequence_checker_.CalledOnValidSequence());
DCHECK(out); DCHECK(out);
ServiceWorkerResourceRecord record; ServiceWorkerResourceRecord record;
if (!record.ParseFromString(serialized)) if (!record.ParseFromString(serialized))
...@@ -1707,6 +1719,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::DeleteResourceRecords( ...@@ -1707,6 +1719,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::DeleteResourceRecords(
int64_t version_id, int64_t version_id,
std::vector<int64_t>* newly_purgeable_resources, std::vector<int64_t>* newly_purgeable_resources,
leveldb::WriteBatch* batch) { leveldb::WriteBatch* batch) {
DCHECK(sequence_checker_.CalledOnValidSequence());
DCHECK(batch); DCHECK(batch);
Status status = STATUS_OK; Status status = STATUS_OK;
...@@ -1830,6 +1843,7 @@ ServiceWorkerDatabase::Status ...@@ -1830,6 +1843,7 @@ ServiceWorkerDatabase::Status
ServiceWorkerDatabase::DeleteUserDataForRegistration( ServiceWorkerDatabase::DeleteUserDataForRegistration(
int64_t registration_id, int64_t registration_id,
leveldb::WriteBatch* batch) { leveldb::WriteBatch* batch) {
DCHECK(sequence_checker_.CalledOnValidSequence());
DCHECK(batch); DCHECK(batch);
Status status = STATUS_OK; Status status = STATUS_OK;
const std::string prefix = CreateUserDataKeyPrefix(registration_id); const std::string prefix = CreateUserDataKeyPrefix(registration_id);
...@@ -1857,6 +1871,7 @@ ServiceWorkerDatabase::DeleteUserDataForRegistration( ...@@ -1857,6 +1871,7 @@ ServiceWorkerDatabase::DeleteUserDataForRegistration(
ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadDatabaseVersion( ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadDatabaseVersion(
int64_t* db_version) { int64_t* db_version) {
DCHECK(sequence_checker_.CalledOnValidSequence());
std::string value; std::string value;
Status status = LevelDBStatusToServiceWorkerDBStatus( Status status = LevelDBStatusToServiceWorkerDBStatus(
db_->Get(leveldb::ReadOptions(), db_->Get(leveldb::ReadOptions(),
...@@ -1889,6 +1904,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadDatabaseVersion( ...@@ -1889,6 +1904,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ReadDatabaseVersion(
ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteBatch( ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteBatch(
leveldb::WriteBatch* batch) { leveldb::WriteBatch* batch) {
DCHECK(sequence_checker_.CalledOnValidSequence());
DCHECK(batch); DCHECK(batch);
DCHECK_NE(DATABASE_STATE_DISABLED, state_); DCHECK_NE(DATABASE_STATE_DISABLED, state_);
...@@ -1909,6 +1925,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteBatch( ...@@ -1909,6 +1925,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::WriteBatch(
void ServiceWorkerDatabase::BumpNextRegistrationIdIfNeeded( void ServiceWorkerDatabase::BumpNextRegistrationIdIfNeeded(
int64_t used_id, int64_t used_id,
leveldb::WriteBatch* batch) { leveldb::WriteBatch* batch) {
DCHECK(sequence_checker_.CalledOnValidSequence());
DCHECK(batch); DCHECK(batch);
if (next_avail_registration_id_ <= used_id) { if (next_avail_registration_id_ <= used_id) {
next_avail_registration_id_ = used_id + 1; next_avail_registration_id_ = used_id + 1;
...@@ -1920,6 +1937,7 @@ void ServiceWorkerDatabase::BumpNextRegistrationIdIfNeeded( ...@@ -1920,6 +1937,7 @@ void ServiceWorkerDatabase::BumpNextRegistrationIdIfNeeded(
void ServiceWorkerDatabase::BumpNextResourceIdIfNeeded( void ServiceWorkerDatabase::BumpNextResourceIdIfNeeded(
int64_t used_id, int64_t used_id,
leveldb::WriteBatch* batch) { leveldb::WriteBatch* batch) {
DCHECK(sequence_checker_.CalledOnValidSequence());
DCHECK(batch); DCHECK(batch);
if (next_avail_resource_id_ <= used_id) { if (next_avail_resource_id_ <= used_id) {
next_avail_resource_id_ = used_id + 1; next_avail_resource_id_ = used_id + 1;
...@@ -1931,6 +1949,7 @@ void ServiceWorkerDatabase::BumpNextResourceIdIfNeeded( ...@@ -1931,6 +1949,7 @@ void ServiceWorkerDatabase::BumpNextResourceIdIfNeeded(
void ServiceWorkerDatabase::BumpNextVersionIdIfNeeded( void ServiceWorkerDatabase::BumpNextVersionIdIfNeeded(
int64_t used_id, int64_t used_id,
leveldb::WriteBatch* batch) { leveldb::WriteBatch* batch) {
DCHECK(sequence_checker_.CalledOnValidSequence());
DCHECK(batch); DCHECK(batch);
if (next_avail_version_id_ <= used_id) { if (next_avail_version_id_ <= used_id) {
next_avail_version_id_ = used_id + 1; next_avail_version_id_ = used_id + 1;
...@@ -1940,11 +1959,13 @@ void ServiceWorkerDatabase::BumpNextVersionIdIfNeeded( ...@@ -1940,11 +1959,13 @@ void ServiceWorkerDatabase::BumpNextVersionIdIfNeeded(
} }
bool ServiceWorkerDatabase::IsOpen() { bool ServiceWorkerDatabase::IsOpen() {
DCHECK(sequence_checker_.CalledOnValidSequence());
return db_ != nullptr; return db_ != nullptr;
} }
void ServiceWorkerDatabase::Disable(const base::Location& from_here, void ServiceWorkerDatabase::Disable(const base::Location& from_here,
Status status) { Status status) {
DCHECK(sequence_checker_.CalledOnValidSequence());
if (status != STATUS_OK) { if (status != STATUS_OK) {
DLOG(ERROR) << "Failed at: " << from_here.ToString() DLOG(ERROR) << "Failed at: " << from_here.ToString()
<< " with error: " << StatusToString(status); << " with error: " << StatusToString(status);
...@@ -1956,6 +1977,7 @@ void ServiceWorkerDatabase::Disable(const base::Location& from_here, ...@@ -1956,6 +1977,7 @@ void ServiceWorkerDatabase::Disable(const base::Location& from_here,
void ServiceWorkerDatabase::HandleOpenResult(const base::Location& from_here, void ServiceWorkerDatabase::HandleOpenResult(const base::Location& from_here,
Status status) { Status status) {
DCHECK(sequence_checker_.CalledOnValidSequence());
if (status != STATUS_OK) if (status != STATUS_OK)
Disable(from_here, status); Disable(from_here, status);
ServiceWorkerMetrics::CountOpenDatabaseResult(status); ServiceWorkerMetrics::CountOpenDatabaseResult(status);
...@@ -1963,6 +1985,7 @@ void ServiceWorkerDatabase::HandleOpenResult(const base::Location& from_here, ...@@ -1963,6 +1985,7 @@ void ServiceWorkerDatabase::HandleOpenResult(const base::Location& from_here,
void ServiceWorkerDatabase::HandleReadResult(const base::Location& from_here, void ServiceWorkerDatabase::HandleReadResult(const base::Location& from_here,
Status status) { Status status) {
DCHECK(sequence_checker_.CalledOnValidSequence());
if (status != STATUS_OK) if (status != STATUS_OK)
Disable(from_here, status); Disable(from_here, status);
ServiceWorkerMetrics::CountReadDatabaseResult(status); ServiceWorkerMetrics::CountReadDatabaseResult(status);
...@@ -1970,12 +1993,14 @@ void ServiceWorkerDatabase::HandleReadResult(const base::Location& from_here, ...@@ -1970,12 +1993,14 @@ void ServiceWorkerDatabase::HandleReadResult(const base::Location& from_here,
void ServiceWorkerDatabase::HandleWriteResult(const base::Location& from_here, void ServiceWorkerDatabase::HandleWriteResult(const base::Location& from_here,
Status status) { Status status) {
DCHECK(sequence_checker_.CalledOnValidSequence());
if (status != STATUS_OK) if (status != STATUS_OK)
Disable(from_here, status); Disable(from_here, status);
ServiceWorkerMetrics::CountWriteDatabaseResult(status); ServiceWorkerMetrics::CountWriteDatabaseResult(status);
} }
bool ServiceWorkerDatabase::IsDatabaseInMemory() const { bool ServiceWorkerDatabase::IsDatabaseInMemory() const {
DCHECK(sequence_checker_.CalledOnValidSequence());
return path_.empty(); return path_.empty();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment