Commit 60124c14 authored by Joshua Bell's avatar Joshua Bell Committed by Commit Bot

Indexed DB: Prevent invalid transaction aborts

During upgrade transactions, a store or index can be created and
then immediately used from script in operations (e.g. "count"). On the
backend, the creation will not run until the transaction acquires a
lock, and pending tasks are queued. A handful of operations (including
"count()") were synchronously checking to see if the target
store/index had been created before queuing the task, which would fail
if the lock had not yet been acquired. The checks must occur when the
task is run; remove the bogus early checks, which would abort the
transaction.

Bug: 1045585
Change-Id: Ibef191e24916333da4e9b2449dda5ff775a35138
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2023521Reviewed-by: default avatarDaniel Murphy <dmurph@chromium.org>
Commit-Queue: Daniel Murphy <dmurph@chromium.org>
Commit-Queue: Joshua Bell <jsbell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#736126}
parent 5d282805
...@@ -245,15 +245,6 @@ void DatabaseImpl::GetAll(int64_t transaction_id, ...@@ -245,15 +245,6 @@ void DatabaseImpl::GetAll(int64_t transaction_id,
return; return;
} }
if (!connection_->database()->IsObjectStoreIdInMetadata(object_store_id)) {
IndexedDBDatabaseError error(blink::mojom::IDBException::kUnknownError,
"Bad request");
std::move(callback).Run(
blink::mojom::IDBDatabaseGetAllResult::NewErrorResult(
blink::mojom::IDBError::New(error.code(), error.message())));
return;
}
blink::mojom::IDBDatabase::GetAllCallback aborting_callback = blink::mojom::IDBDatabase::GetAllCallback aborting_callback =
CreateCallbackAbortOnDestruct<blink::mojom::IDBDatabase::GetAllCallback, CreateCallbackAbortOnDestruct<blink::mojom::IDBDatabase::GetAllCallback,
blink::mojom::IDBDatabaseGetAllResultPtr>( blink::mojom::IDBDatabaseGetAllResultPtr>(
...@@ -399,10 +390,6 @@ void DatabaseImpl::Count( ...@@ -399,10 +390,6 @@ void DatabaseImpl::Count(
if (!transaction) if (!transaction)
return; return;
if (!connection_->database()->IsObjectStoreIdAndMaybeIndexIdInMetadata(
object_store_id, index_id))
return;
transaction->ScheduleTask(BindWeakOperation( transaction->ScheduleTask(BindWeakOperation(
&IndexedDBDatabase::CountOperation, connection_->database()->AsWeakPtr(), &IndexedDBDatabase::CountOperation, connection_->database()->AsWeakPtr(),
object_store_id, index_id, object_store_id, index_id,
...@@ -428,9 +415,6 @@ void DatabaseImpl::DeleteRange( ...@@ -428,9 +415,6 @@ void DatabaseImpl::DeleteRange(
if (!transaction) if (!transaction)
return; return;
if (!connection_->database()->IsObjectStoreIdInMetadata(object_store_id))
return;
transaction->ScheduleTask(BindWeakOperation( transaction->ScheduleTask(BindWeakOperation(
&IndexedDBDatabase::DeleteRangeOperation, &IndexedDBDatabase::DeleteRangeOperation,
connection_->database()->AsWeakPtr(), object_store_id, connection_->database()->AsWeakPtr(), object_store_id,
...@@ -477,9 +461,6 @@ void DatabaseImpl::Clear( ...@@ -477,9 +461,6 @@ void DatabaseImpl::Clear(
if (!transaction) if (!transaction)
return; return;
if (!connection_->database()->IsObjectStoreIdInMetadata(object_store_id))
return;
transaction->ScheduleTask(BindWeakOperation( transaction->ScheduleTask(BindWeakOperation(
&IndexedDBDatabase::ClearOperation, connection_->database()->AsWeakPtr(), &IndexedDBDatabase::ClearOperation, connection_->database()->AsWeakPtr(),
object_store_id, std::move(callbacks))); object_store_id, std::move(callbacks)));
......
...@@ -956,7 +956,7 @@ Status IndexedDBDatabase::GetAllOperation( ...@@ -956,7 +956,7 @@ Status IndexedDBDatabase::GetAllOperation(
IndexedDBTransaction* transaction) { IndexedDBTransaction* transaction) {
IDB_TRACE1("IndexedDBDatabase::GetAllOperation", "txn.id", transaction->id()); IDB_TRACE1("IndexedDBDatabase::GetAllOperation", "txn.id", transaction->id());
if (!IsObjectStoreIdInMetadata(object_store_id)) { if (!IsObjectStoreIdAndMaybeIndexIdInMetadata(object_store_id, index_id)) {
IndexedDBDatabaseError error = CreateError( IndexedDBDatabaseError error = CreateError(
blink::mojom::IDBException::kUnknownError, "Bad request", transaction); blink::mojom::IDBException::kUnknownError, "Bad request", transaction);
std::move(callback).Run( std::move(callback).Run(
......
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