зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1402581 - P3: Allow failures happen when restoring or wiping padding file. r=bkelly
--HG-- extra : rebase_source : 6582320e3c942c37a8b031e16569a4900871f458
This commit is contained in:
Родитель
71dc552750
Коммит
45c9e8c00b
|
@ -868,26 +868,35 @@ LockedDirectoryPaddingFinalizeWrite(nsIFile* aBaseDir)
|
|||
|
||||
// static
|
||||
nsresult
|
||||
LockedDirectoryPaddingRestore(nsIFile* aBaseDir, mozIStorageConnection* aConn)
|
||||
LockedDirectoryPaddingRestore(nsIFile* aBaseDir, mozIStorageConnection* aConn,
|
||||
bool aMustRestore, int64_t* aPaddingSizeOut)
|
||||
{
|
||||
MOZ_DIAGNOSTIC_ASSERT(aBaseDir);
|
||||
MOZ_DIAGNOSTIC_ASSERT(aConn);
|
||||
MOZ_DIAGNOSTIC_ASSERT(aPaddingSizeOut);
|
||||
|
||||
// The content of padding file is untrusted, so remove it here.
|
||||
nsresult rv = LockedDirectoryPaddingDeleteFile(aBaseDir,
|
||||
DirPaddingFile::FILE);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
|
||||
|
||||
rv = LockedDirectoryPaddingDeleteFile(aBaseDir, DirPaddingFile::TMP_FILE);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
|
||||
|
||||
int64_t paddingSize = 0;
|
||||
rv = db::FindOverallPaddingSize(aConn, &paddingSize);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
|
||||
|
||||
MOZ_DIAGNOSTIC_ASSERT(paddingSize >= 0);
|
||||
*aPaddingSizeOut = paddingSize;
|
||||
|
||||
LockedDirectoryPaddingWrite(aBaseDir, DirPaddingFile::FILE, paddingSize);
|
||||
rv = LockedDirectoryPaddingWrite(aBaseDir, DirPaddingFile::FILE, paddingSize);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
// If we cannot write the correct padding size to file, just keep the
|
||||
// temporary file and let the padding size to be recalculate in the next
|
||||
// action
|
||||
return aMustRestore ? rv : NS_OK;
|
||||
}
|
||||
|
||||
rv = LockedDirectoryPaddingDeleteFile(aBaseDir, DirPaddingFile::TMP_FILE);
|
||||
Unused << NS_WARN_IF(NS_FAILED(rv));
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -121,7 +121,8 @@ nsresult
|
|||
LockedDirectoryPaddingFinalizeWrite(nsIFile* aBaseDir);
|
||||
|
||||
nsresult
|
||||
LockedDirectoryPaddingRestore(nsIFile* aBaseDir, mozIStorageConnection* aConn);
|
||||
LockedDirectoryPaddingRestore(nsIFile* aBaseDir, mozIStorageConnection* aConn,
|
||||
bool aMustRestore, int64_t* aPaddingSizeOut);
|
||||
|
||||
nsresult
|
||||
LockedDirectoryPaddingDeleteFile(nsIFile* aBaseDir,
|
||||
|
|
|
@ -70,6 +70,40 @@ GetBodyUsage(nsIFile* aDir, const Atomic<bool>& aCanceled,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
static nsresult
|
||||
LockedGetPaddingSizeFromDB(nsIFile* aDir, const nsACString& aGroup,
|
||||
const nsACString& aOrigin, int64_t* aPaddingSizeOut)
|
||||
{
|
||||
MOZ_DIAGNOSTIC_ASSERT(aDir);
|
||||
MOZ_DIAGNOSTIC_ASSERT(aPaddingSizeOut);
|
||||
|
||||
*aPaddingSizeOut = 0;
|
||||
|
||||
nsCOMPtr<mozIStorageConnection> conn;
|
||||
QuotaInfo quotaInfo;
|
||||
quotaInfo.mGroup = aGroup;
|
||||
quotaInfo.mOrigin = aOrigin;
|
||||
nsresult rv = mozilla::dom::cache::
|
||||
OpenDBConnection(quotaInfo, aDir, getter_AddRefs(conn));
|
||||
if (rv == NS_ERROR_FILE_NOT_FOUND ||
|
||||
rv == NS_ERROR_FILE_TARGET_DOES_NOT_EXIST) {
|
||||
// Return NS_OK with size = 0 if both the db and padding file don't exist.
|
||||
// There is no other way to get the overall padding size of an origin.
|
||||
return NS_OK;
|
||||
}
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
|
||||
|
||||
int64_t paddingSize = 0;
|
||||
rv = mozilla::dom::cache::
|
||||
LockedDirectoryPaddingRestore(aDir, conn, /* aMustRestore */ false,
|
||||
&paddingSize);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
|
||||
|
||||
*aPaddingSizeOut = paddingSize;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
class CacheQuotaClient final : public Client
|
||||
{
|
||||
static CacheQuotaClient* sInstance;
|
||||
|
@ -143,18 +177,7 @@ public:
|
|||
NS_WARN_IF(NS_FAILED(mozilla::dom::cache::
|
||||
LockedDirectoryPaddingGet(dir,
|
||||
&paddingSize)))) {
|
||||
nsCOMPtr<mozIStorageConnection> conn;
|
||||
QuotaInfo quotaInfo;
|
||||
quotaInfo.mGroup = aGroup;
|
||||
quotaInfo.mOrigin = aOrigin;
|
||||
rv = mozilla::dom::cache::
|
||||
OpenDBConnection(quotaInfo, dir, getter_AddRefs(conn));
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
|
||||
|
||||
rv = mozilla::dom::cache::LockedDirectoryPaddingRestore(dir, conn);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
|
||||
|
||||
rv = mozilla::dom::cache::LockedDirectoryPaddingGet(dir, &paddingSize);
|
||||
rv = LockedGetPaddingSizeFromDB(dir, aGroup, aOrigin, &paddingSize);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
|
||||
}
|
||||
}
|
||||
|
@ -371,10 +394,14 @@ public:
|
|||
MOZ_DIAGNOSTIC_ASSERT(aBaseDir);
|
||||
MOZ_DIAGNOSTIC_ASSERT(aConn);
|
||||
|
||||
int64_t dummyPaddingSize;
|
||||
|
||||
MutexAutoLock lock(mDirPaddingFileMutex);
|
||||
|
||||
nsresult rv =
|
||||
mozilla::dom::cache::LockedDirectoryPaddingRestore(aBaseDir, aConn);
|
||||
mozilla::dom::cache::
|
||||
LockedDirectoryPaddingRestore(aBaseDir, aConn, /* aMustRestore */ true,
|
||||
&dummyPaddingSize);
|
||||
Unused << NS_WARN_IF(NS_FAILED(rv));
|
||||
|
||||
return rv;
|
||||
|
@ -389,20 +416,21 @@ public:
|
|||
|
||||
MutexAutoLock lock(mDirPaddingFileMutex);
|
||||
|
||||
// Remove temporary file if we have one.
|
||||
nsresult rv =
|
||||
mozilla::dom::cache::
|
||||
LockedDirectoryPaddingDeleteFile(aBaseDir, DirPaddingFile::TMP_FILE);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
|
||||
|
||||
MOZ_DIAGNOSTIC_ASSERT(mozilla::dom::cache::
|
||||
DirectoryPaddingFileExists(aBaseDir,
|
||||
DirPaddingFile::FILE));
|
||||
MOZ_ASSERT(mozilla::dom::cache::
|
||||
DirectoryPaddingFileExists(aBaseDir, DirPaddingFile::FILE));
|
||||
|
||||
int64_t paddingSize = 0;
|
||||
rv = mozilla::dom::cache::LockedDirectoryPaddingGet(aBaseDir, &paddingSize);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
// If read file fail, there is nothing we can do to recover the file.
|
||||
bool temporaryPaddingFileExist =
|
||||
mozilla::dom::cache::
|
||||
DirectoryPaddingFileExists(aBaseDir, DirPaddingFile::TMP_FILE);
|
||||
|
||||
if (temporaryPaddingFileExist ||
|
||||
NS_WARN_IF(NS_FAILED(
|
||||
mozilla::dom::cache::
|
||||
LockedDirectoryPaddingGet(aBaseDir, &paddingSize)))) {
|
||||
// XXXtt: Maybe have a method in the QuotaManager to clean the usage under
|
||||
// the quota client and the origin.
|
||||
// There is nothing we can do to recover the file.
|
||||
NS_WARNING("Cannnot read padding size from file!");
|
||||
paddingSize = 0;
|
||||
}
|
||||
|
@ -411,8 +439,14 @@ public:
|
|||
mozilla::dom::cache::DecreaseUsageForQuotaInfo(aQuotaInfo, paddingSize);
|
||||
}
|
||||
|
||||
nsresult rv =
|
||||
mozilla::dom::cache::
|
||||
LockedDirectoryPaddingDeleteFile(aBaseDir, DirPaddingFile::FILE);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
|
||||
|
||||
// Remove temporary file if we have one.
|
||||
rv = mozilla::dom::cache::
|
||||
LockedDirectoryPaddingDeleteFile(aBaseDir, DirPaddingFile::FILE);
|
||||
LockedDirectoryPaddingDeleteFile(aBaseDir, DirPaddingFile::TMP_FILE);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) { return rv; }
|
||||
|
||||
rv = mozilla::dom::cache::LockedDirectoryPaddingInit(aBaseDir);
|
||||
|
|
Загрузка…
Ссылка в новой задаче