Bug 1402581 - P3: Allow failures happen when restoring or wiping padding file. r=bkelly

--HG--
extra : rebase_source : 6582320e3c942c37a8b031e16569a4900871f458
This commit is contained in:
Tom Tung 2017-10-05 17:30:40 +08:00
Родитель 71dc552750
Коммит 45c9e8c00b
3 изменённых файлов: 76 добавлений и 32 удалений

19
dom/cache/FileUtils.cpp поставляемый
Просмотреть файл

@ -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;
}

3
dom/cache/FileUtils.h поставляемый
Просмотреть файл

@ -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,

86
dom/cache/QuotaClient.cpp поставляемый
Просмотреть файл

@ -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);