UpdaterCommon: Use File::Copy() on non-macOS platforms

This commit is contained in:
OatmealDome 2021-07-09 12:56:23 -04:00
parent cfcc994f6c
commit a39b7a45c0
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;