Merge pull request #9880 from OatmealDome/windows-updater

UpdaterCommon: Use File::Copy() on non-macOS platforms
This commit is contained in:
JosJuice 2021-07-09 19:02:42 +02:00 committed by GitHub
commit afe9c6fb9a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 0 deletions

View File

@ -430,7 +430,16 @@ bool UpdateFiles(const std::vector<TodoList::UpdateOp>& to_update,
std::string content_filename = HexEncode(op.new_hash.data(), op.new_hash.size()); std::string content_filename = HexEncode(op.new_hash.data(), op.new_hash.size());
fprintf(log_fp, "Updating file %s from content %s...\n", op.filename.c_str(), fprintf(log_fp, "Updating file %s from content %s...\n", op.filename.c_str(),
content_filename.c_str()); content_filename.c_str());
#ifdef __APPLE__
// macOS caches the code signature of Mach-O executables when they're first loaded.
// Unfortunately, there is a quirk in the kernel with how it handles the cache: if the file is
// simply overwritten, the cache isn't invalidated and the old code signature is used to verify
// the new file. This causes macOS to kill the process with a code signing error. To workaround
// this, we use File::Rename() instead of File::Copy().
if (!File::Rename(temp_path + DIR_SEP + content_filename, path)) if (!File::Rename(temp_path + DIR_SEP + content_filename, path))
#else
if (!File::Copy(temp_path + DIR_SEP + content_filename, path))
#endif
{ {
fprintf(log_fp, "Could not update file %s.\n", op.filename.c_str()); fprintf(log_fp, "Could not update file %s.\n", op.filename.c_str());
return false; return false;