diff --git a/storage/mozStorageConnection.cpp b/storage/mozStorageConnection.cpp index 7af11a3d4767..a19fa8e5c362 100644 --- a/storage/mozStorageConnection.cpp +++ b/storage/mozStorageConnection.cpp @@ -642,6 +642,8 @@ class AsyncBackupDatabaseFile final : public Runnable, public nsITimerCallback { int srv = ::sqlite3_open(NS_ConvertUTF16toUTF8(path).get(), &mBackupFile); if (srv != SQLITE_OK) { + ::sqlite3_close(mBackupFile); + mBackupFile = nullptr; return Dispatch(NS_ERROR_FAILURE, nullptr); } @@ -1053,6 +1055,7 @@ nsresult Connection::initialize(const nsACString& aStorageKey, int srv = ::sqlite3_open_v2(path.get(), &mDBConn, mFlags, basevfs::GetVFSName(true)); if (srv != SQLITE_OK) { + ::sqlite3_close(mDBConn); mDBConn = nullptr; nsresult rv = convertResultCode(srv); RecordOpenStatus(rv); @@ -1101,6 +1104,7 @@ nsresult Connection::initialize(nsIFile* aDatabaseFile) { srv = ::sqlite3_open_v2(NS_ConvertUTF16toUTF8(path).get(), &mDBConn, mFlags, basevfs::GetVFSName(exclusive)); if (exclusive && (srv == SQLITE_LOCKED || srv == SQLITE_BUSY)) { + ::sqlite3_close(mDBConn); // Retry without trying to get an exclusive lock. exclusive = false; srv = ::sqlite3_open_v2(NS_ConvertUTF16toUTF8(path).get(), &mDBConn, @@ -1108,6 +1112,7 @@ nsresult Connection::initialize(nsIFile* aDatabaseFile) { } } if (srv != SQLITE_OK) { + ::sqlite3_close(mDBConn); mDBConn = nullptr; rv = convertResultCode(srv); RecordOpenStatus(rv); @@ -1125,6 +1130,9 @@ nsresult Connection::initialize(nsIFile* aDatabaseFile) { basevfs::GetVFSName(false)); if (srv == SQLITE_OK) { rv = initializeInternal(); + } else { + ::sqlite3_close(mDBConn); + mDBConn = nullptr; } } @@ -1184,6 +1192,7 @@ nsresult Connection::initialize(nsIFileURL* aFileURL) { int srv = ::sqlite3_open_v2(spec.get(), &mDBConn, mFlags, vfs); if (srv != SQLITE_OK) { + ::sqlite3_close(mDBConn); mDBConn = nullptr; rv = convertResultCode(srv); RecordOpenStatus(rv); diff --git a/storage/test/chrome/chrome.toml b/storage/test/chrome/chrome.toml new file mode 100644 index 000000000000..9aff552ce283 --- /dev/null +++ b/storage/test/chrome/chrome.toml @@ -0,0 +1,3 @@ +[DEFAULT] + +["test_failedOpenConnection_leak.html"] diff --git a/storage/test/chrome/test_failedOpenConnection_leak.html b/storage/test/chrome/test_failedOpenConnection_leak.html new file mode 100644 index 000000000000..6824800f3523 --- /dev/null +++ b/storage/test/chrome/test_failedOpenConnection_leak.html @@ -0,0 +1,61 @@ + + + + + + Tests for the BackupSettings component + + + + + + + +

+ +

+
+
+
diff --git a/storage/test/moz.build b/storage/test/moz.build
index 7dd21f5fe24c..108bcf654e62 100644
--- a/storage/test/moz.build
+++ b/storage/test/moz.build
@@ -5,6 +5,7 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 XPCSHELL_TESTS_MANIFESTS += ["unit/xpcshell.toml"]
+MOCHITEST_CHROME_MANIFESTS += ["chrome/chrome.toml"]
 
 TEST_DIRS += ["gtest"]