Bug 1185223 - crash at [@ mozilla::dom::quota::QuotaObject::Release() ]; r=khuey, a=sylvestre
--- a/dom/indexedDB/ActorsParent.cpp
+++ b/dom/indexedDB/ActorsParent.cpp
@@ -16377,31 +16377,52 @@ QuotaClient::PerformIdleMaintenanceOnDat
MOZ_ASSERT(!NS_IsMainThread());
MOZ_ASSERT(!IsOnBackgroundThread());
MOZ_ASSERT(mMaintenanceThreadPool);
MOZ_ASSERT(mMaintenanceStartTime);
MOZ_ASSERT(!aMaintenanceInfo.mDatabasePath.IsEmpty());
MOZ_ASSERT(!aMaintenanceInfo.mGroup.IsEmpty());
MOZ_ASSERT(!aMaintenanceInfo.mOrigin.IsEmpty());
+ class MOZ_STACK_CLASS AutoClose final
+ {
+ nsCOMPtr<mozIStorageConnection> mConnection;
+
+ public:
+ AutoClose(mozIStorageConnection* aConnection)
+ : mConnection(aConnection)
+ {
+ MOZ_ASSERT(aConnection);
+ }
+
+ ~AutoClose()
+ {
+ MOZ_ASSERT(mConnection);
+
+ MOZ_ALWAYS_TRUE(NS_SUCCEEDED(mConnection->Close()));
+ }
+ };
+
nsCOMPtr<nsIFile> databaseFile =
GetFileForPath(aMaintenanceInfo.mDatabasePath);
MOZ_ASSERT(databaseFile);
nsCOMPtr<mozIStorageConnection> connection;
nsresult rv = GetStorageConnection(databaseFile,
aMaintenanceInfo.mPersistenceType,
aMaintenanceInfo.mGroup,
aMaintenanceInfo.mOrigin,
TelemetryIdForFile(databaseFile),
getter_AddRefs(connection));
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
+ AutoClose autoClose(connection);
+
if (IdleMaintenanceMustEnd(aRunId)) {
return;
}
AutoProgressHandler progressHandler(this, aRunId);
if (NS_WARN_IF(NS_FAILED(progressHandler.Register(connection)))) {
return;
}