[Lldb-commits] [lldb] b6ae893 - [lldb/PlatformDarwin] Always delete destination file first in PutFile
Fred Riss via lldb-commits
lldb-commits at lists.llvm.org
Mon Mar 23 14:35:14 PDT 2020
Author: Fred Riss
Date: 2020-03-23T14:34:17-07:00
New Revision: b6ae8937e031cde2e70e6a83d46c21e940fdf4ac
URL: https://github.com/llvm/llvm-project/commit/b6ae8937e031cde2e70e6a83d46c21e940fdf4ac
DIFF: https://github.com/llvm/llvm-project/commit/b6ae8937e031cde2e70e6a83d46c21e940fdf4ac.diff
LOG: [lldb/PlatformDarwin] Always delete destination file first in PutFile
Summary:
The default behavior of Platform::PutFile is to open the file and
truncate it if it already exists. This works fine and is a sensible
default, but it interacts badly with code-signing on iOS, as doing so
invalidates the signature of the file (even if the new content has a
valid code signature).
We have a couple tests which on purpose reload a different binary with
the same name. Those tests are currently broken because of the above
interaction.
This patch simply makes the Darwin platform unconditionally delete the
destination file before sending the new one to work around this issue.
Reviewers: jasonmolenda
Subscribers: lldb-commits
Tags: #lldb
Differential Revision: https://reviews.llvm.org/D76450
Added:
Modified:
lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
Removed:
################################################################################
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
index 46dd3774e5a9..350043f8d4e9 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
@@ -58,6 +58,17 @@ PlatformDarwin::PlatformDarwin(bool is_host)
/// inherited from by the plug-in instance.
PlatformDarwin::~PlatformDarwin() {}
+lldb_private::Status
+PlatformDarwin::PutFile(const lldb_private::FileSpec &source,
+ const lldb_private::FileSpec &destination, uint32_t uid,
+ uint32_t gid) {
+ // Unconditionally unlink the destination. If it is an executable,
+ // simply opening it and truncating its contents would invalidate
+ // its cached code signature.
+ Unlink(destination);
+ return PlatformPOSIX::PutFile(source, destination, uid, gid);
+}
+
FileSpecList PlatformDarwin::LocateExecutableScriptingResources(
Target *target, Module &module, Stream *feedback_stream) {
FileSpecList file_list;
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
index 6d51edbc9294..f6729c508f00 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
@@ -25,6 +25,11 @@ class PlatformDarwin : public PlatformPOSIX {
~PlatformDarwin() override;
+ lldb_private::Status PutFile(const lldb_private::FileSpec &source,
+ const lldb_private::FileSpec &destination,
+ uint32_t uid = UINT32_MAX,
+ uint32_t gid = UINT32_MAX) override;
+
// lldb_private::Platform functions
lldb_private::Status
ResolveSymbolFile(lldb_private::Target &target,
More information about the lldb-commits
mailing list