0

Use FLAG_SHARE_DELETE when opening files in the installer.

This CL adds FLAG_SHARE_DELETE to many file operations in Chrome's
installer; including in delta patch processing and archive extraction
utilities. This allows processing on files that are held open to be
deleted by another entity so that we can eventually hold temporary files
open with FILE_FLAG_DELETE_ON_CLOSE.

BUG=516207

Change-Id: I1cd03f6360dfcd61fcd2f09797f0923331076415
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2302109
Reviewed-by: Will Harris <wfh@chromium.org>
Commit-Queue: Greg Thompson <grt@chromium.org>
Cr-Commit-Position: refs/heads/master@{#789702}
This commit is contained in:
Greg Thompson
2020-07-18 01:29:39 +00:00
committed by Commit Bot
parent f0b48e8333
commit f176eba36c
7 changed files with 43 additions and 35 deletions
chrome/installer
components/zucchini
courgette

@ -96,8 +96,9 @@ FNOPEN(Open) {
}
scoped_ptr<wchar_t> path(Utf8ToWide(pszFile));
HANDLE file = CreateFileW(path, access, FILE_SHARE_READ, nullptr, disposition,
FILE_ATTRIBUTE_NORMAL, nullptr);
HANDLE file =
CreateFileW(path, access, FILE_SHARE_DELETE | FILE_SHARE_READ, nullptr,
disposition, FILE_ATTRIBUTE_NORMAL, nullptr);
return reinterpret_cast<INT_PTR>(file);
}

@ -508,7 +508,7 @@ base::string16 InstallUtil::GetCurrentDate() {
bool InstallUtil::ProgramCompare::OpenForInfo(const base::FilePath& path,
base::File* file) {
DCHECK(file);
file->Initialize(path, base::File::FLAG_OPEN);
file->Initialize(path, base::File::FLAG_OPEN | base::File::FLAG_SHARE_DELETE);
return file->IsValid();
}

@ -147,7 +147,8 @@ UnPackStatus LzmaUtilImpl::OpenArchive(const base::FilePath& archivePath) {
archive_file_.Initialize(archivePath, base::File::FLAG_OPEN |
base::File::FLAG_READ |
base::File::FLAG_EXCLUSIVE_WRITE);
base::File::FLAG_EXCLUSIVE_WRITE |
base::File::FLAG_SHARE_DELETE);
if (archive_file_.IsValid())
return UNPACK_NO_ERROR;
error_code_ = ::GetLastError();

@ -55,7 +55,8 @@ zucchini::status::Code MainApply(MainParams params) {
zucchini::status::Code MainRead(MainParams params) {
CHECK_EQ(1U, params.file_paths.size());
base::File input_file(params.file_paths[0],
base::File::FLAG_OPEN | base::File::FLAG_READ);
base::File::FLAG_OPEN | base::File::FLAG_READ |
base::File::FLAG_SHARE_DELETE);
zucchini::MappedFileReader input(std::move(input_file));
if (input.HasError()) {
LOG(ERROR) << "Error with file " << params.file_paths[0].value() << ": "
@ -74,7 +75,8 @@ zucchini::status::Code MainRead(MainParams params) {
zucchini::status::Code MainDetect(MainParams params) {
CHECK_EQ(1U, params.file_paths.size());
base::File input_file(params.file_paths[0],
base::File::FLAG_OPEN | base::File::FLAG_READ);
base::File::FLAG_OPEN | base::File::FLAG_READ |
base::File::FLAG_SHARE_DELETE);
zucchini::MappedFileReader input(std::move(input_file));
if (input.HasError()) {
LOG(ERROR) << "Error with file " << params.file_paths[0].value() << ": "
@ -93,14 +95,16 @@ zucchini::status::Code MainDetect(MainParams params) {
zucchini::status::Code MainMatch(MainParams params) {
CHECK_EQ(2U, params.file_paths.size());
using base::File;
File old_file(params.file_paths[0], File::FLAG_OPEN | File::FLAG_READ);
File old_file(params.file_paths[0], File::FLAG_OPEN | File::FLAG_READ |
base::File::FLAG_SHARE_DELETE);
zucchini::MappedFileReader old_image(std::move(old_file));
if (old_image.HasError()) {
LOG(ERROR) << "Error with file " << params.file_paths[0].value() << ": "
<< old_image.error();
return zucchini::status::kStatusFileReadError;
}
File new_file(params.file_paths[1], File::FLAG_OPEN | File::FLAG_READ);
File new_file(params.file_paths[1], File::FLAG_OPEN | File::FLAG_READ |
base::File::FLAG_SHARE_DELETE);
zucchini::MappedFileReader new_image(std::move(new_file));
if (new_image.HasError()) {
LOG(ERROR) << "Error with file " << params.file_paths[1].value() << ": "
@ -122,7 +126,8 @@ zucchini::status::Code MainMatch(MainParams params) {
zucchini::status::Code MainCrc32(MainParams params) {
CHECK_EQ(1U, params.file_paths.size());
base::File image_file(params.file_paths[0],
base::File::FLAG_OPEN | base::File::FLAG_READ);
base::File::FLAG_OPEN | base::File::FLAG_READ |
base::File::FLAG_SHARE_DELETE);
zucchini::MappedFileReader image(std::move(image_file));
if (image.HasError()) {
LOG(ERROR) << "Error with file " << params.file_paths[0].value() << ": "

@ -167,8 +167,10 @@ status::Code Generate(const base::FilePath& old_path,
bool is_raw,
std::string imposed_matches) {
using base::File;
File old_file(old_path, File::FLAG_OPEN | File::FLAG_READ);
File new_file(new_path, File::FLAG_OPEN | File::FLAG_READ);
File old_file(old_path, File::FLAG_OPEN | File::FLAG_READ |
base::File::FLAG_SHARE_DELETE);
File new_file(new_path, File::FLAG_OPEN | File::FLAG_READ |
base::File::FLAG_SHARE_DELETE);
File patch_file(patch_path, File::FLAG_CREATE_ALWAYS | File::FLAG_READ |
File::FLAG_WRITE | File::FLAG_SHARE_DELETE |
File::FLAG_CAN_DELETE_ON_CLOSE);
@ -192,8 +194,10 @@ status::Code Apply(const base::FilePath& old_path,
const base::FilePath& new_path,
bool force_keep) {
using base::File;
File old_file(old_path, File::FLAG_OPEN | File::FLAG_READ);
File patch_file(patch_path, File::FLAG_OPEN | File::FLAG_READ);
File old_file(old_path, File::FLAG_OPEN | File::FLAG_READ |
base::File::FLAG_SHARE_DELETE);
File patch_file(patch_path, File::FLAG_OPEN | File::FLAG_READ |
base::File::FLAG_SHARE_DELETE);
File new_file(new_path, File::FLAG_CREATE_ALWAYS | File::FLAG_READ |
File::FLAG_WRITE | File::FLAG_SHARE_DELETE |
File::FLAG_CAN_DELETE_ON_CLOSE);

@ -419,17 +419,16 @@ Status ApplyEnsemblePatch(const base::FilePath::CharType* old_file_name,
const base::FilePath::CharType* patch_file_name,
const base::FilePath::CharType* new_file_name) {
Status result = ApplyEnsemblePatch(
base::File(
base::FilePath(old_file_name),
base::File::FLAG_OPEN | base::File::FLAG_READ),
base::File(
base::FilePath(patch_file_name),
base::File::FLAG_OPEN | base::File::FLAG_READ),
base::File(
base::FilePath(new_file_name),
base::File::FLAG_CREATE_ALWAYS |
base::File::FLAG_WRITE |
base::File::FLAG_EXCLUSIVE_WRITE));
base::File(base::FilePath(old_file_name),
base::File::FLAG_OPEN | base::File::FLAG_READ |
base::File::FLAG_SHARE_DELETE),
base::File(base::FilePath(patch_file_name),
base::File::FLAG_OPEN | base::File::FLAG_READ |
base::File::FLAG_SHARE_DELETE),
base::File(base::FilePath(new_file_name),
base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE |
base::File::FLAG_EXCLUSIVE_WRITE |
base::File::FLAG_SHARE_DELETE));
if (result != C_OK)
base::DeleteFile(base::FilePath(new_file_name));
return result;

@ -230,17 +230,15 @@ BSDiffStatus ApplyBinaryPatch(const base::FilePath& old_file_path,
const base::FilePath& patch_file_path,
const base::FilePath& new_file_path) {
BSDiffStatus result = ApplyBinaryPatch(
base::File(
old_file_path,
base::File::FLAG_OPEN | base::File::FLAG_READ),
base::File(
patch_file_path,
base::File::FLAG_OPEN | base::File::FLAG_READ),
base::File(
new_file_path,
base::File::FLAG_CREATE_ALWAYS |
base::File::FLAG_WRITE |
base::File::FLAG_EXCLUSIVE_WRITE));
base::File(old_file_path, base::File::FLAG_OPEN | base::File::FLAG_READ |
base::File::FLAG_SHARE_DELETE),
base::File(patch_file_path, base::File::FLAG_OPEN |
base::File::FLAG_READ |
base::File::FLAG_SHARE_DELETE),
base::File(new_file_path, base::File::FLAG_CREATE_ALWAYS |
base::File::FLAG_WRITE |
base::File::FLAG_EXCLUSIVE_WRITE |
base::File::FLAG_SHARE_DELETE));
if (result != OK)
base::DeleteFile(new_file_path);
return result;