Bug 1621916 - Fix IndexedDB to ignore unknown files in the files and journals directory during initialization and usage calculation; r=dom-workers-and-storage-reviewers,ttung

All unknown files in the files and journals directory are now properly filtered
out if the filename can't be converted to an integer.

Differential Revision: https://phabricator.services.mozilla.com/D76703
This commit is contained in:
Jan Varga 2020-05-26 07:22:12 +00:00
Родитель e93eaffe2e
Коммит 68a6cbf429
3 изменённых файлов: 59 добавлений и 8 удалений

Просмотреть файл

@ -142,6 +142,12 @@
# define IDB_MOBILE
#endif
#define UNKNOWN_FILE_WARNING(_leafName) \
NS_WARNING( \
nsPrintfCString("Something (%s) in the directory that doesn't belong!", \
NS_ConvertUTF16toUTF8(_leafName).get()) \
.get())
namespace mozilla {
MOZ_TYPE_SPECIFIC_SCOPED_POINTER_TEMPLATE(ScopedPRFileDesc, PRFileDesc,
@ -16684,13 +16690,32 @@ nsresult FileManager::InitDirectory(nsIFile& aDirectory, nsIFile& aDatabaseFile,
return rv;
}
bool hasElements;
rv = entries->HasMoreElements(&hasElements);
bool hasJournals = false;
nsCOMPtr<nsIFile> file;
while (NS_SUCCEEDED((rv = entries->GetNextFile(getter_AddRefs(file)))) &&
file) {
nsString leafName;
rv = file->GetLeafName(leafName);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
leafName.ToInteger64(&rv);
if (NS_SUCCEEDED(rv)) {
hasJournals = true;
continue;
}
UNKNOWN_FILE_WARNING(leafName);
}
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
if (hasElements) {
if (hasJournals) {
auto connectionOrErr = CreateStorageConnection(
aDatabaseFile, aDirectory, VoidString(), aOrigin,
/* aDirectoryLockId */ -1, aTelemetryId);
@ -16739,6 +16764,11 @@ nsresult FileManager::InitDirectory(nsIFile& aDirectory, nsIFile& aDatabaseFile,
return rv;
}
name.ToInteger64(&rv);
if (NS_FAILED(rv)) {
continue;
}
int32_t flag = stmt->AsInt32(1);
if (!flag) {
@ -16830,13 +16860,20 @@ nsresult FileManager::GetUsage(nsIFile* aDirectory, Maybe<uint64_t>& aUsage) {
continue;
}
int64_t fileSize;
rv = file->GetFileSize(&fileSize);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
leafName.ToInteger64(&rv);
if (NS_SUCCEEDED(rv)) {
int64_t fileSize;
rv = file->GetFileSize(&fileSize);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
UsageInfo::IncrementUsage(usage, Some(uint64_t(fileSize)));
continue;
}
UsageInfo::IncrementUsage(usage, Some(uint64_t(fileSize)));
UNKNOWN_FILE_WARNING(leafName);
}
if (NS_WARN_IF(NS_FAILED(rv))) {
@ -17785,6 +17822,14 @@ nsresult QuotaClient::GetUsageForDirectoryInternal(nsIFile* aDirectory,
continue;
}
if (!aDatabaseFiles) {
leafName.ToInteger64(&rv);
if (NS_FAILED(rv)) {
UNKNOWN_FILE_WARNING(leafName);
continue;
}
}
int64_t fileSize;
rv = file->GetFileSize(&fileSize);
if (NS_WARN_IF(NS_FAILED(rv))) {

Просмотреть файл

@ -84,6 +84,12 @@ async function testSteps() {
// TODO: Fix IndexedDB to ignore unknown files as well
// createUnknownFileIn(`${originRelativePath}/idb`);
createUnknownFileIn(
`${originRelativePath}/idb/2320029346mByDIdnedxe.files`
);
createUnknownFileIn(
`${originRelativePath}/idb/2320029346mByDIdnedxe.files/journals`
);
}
// Unknown file in cache client directory

Двоичные данные
dom/quota/test/xpcshell/unknownFiles_profile.zip

Двоичный файл не отображается.