From a39b7a45c0609771496936fadee6eb016447851c Mon Sep 17 00:00:00 2001 From: OatmealDome Date: Fri, 9 Jul 2021 12:56:23 -0400 Subject: [PATCH] UpdaterCommon: Use File::Copy() on non-macOS platforms --- Source/Core/UpdaterCommon/UpdaterCommon.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Source/Core/UpdaterCommon/UpdaterCommon.cpp b/Source/Core/UpdaterCommon/UpdaterCommon.cpp index 791f501151..74665bf4c1 100644 --- a/Source/Core/UpdaterCommon/UpdaterCommon.cpp +++ b/Source/Core/UpdaterCommon/UpdaterCommon.cpp @@ -430,7 +430,16 @@ bool UpdateFiles(const std::vector& to_update, 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(), 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)) +#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()); return false;