aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
diff options
context:
space:
mode:
authorAlex Brachet <alexbrachetmialot@gmail.com>2019-07-04 22:45:27 +0000
committerAlex Brachet <alexbrachetmialot@gmail.com>2019-07-04 22:45:27 +0000
commit7439a9a921123ca84fa8a07bf138fc0552ebeb0a (patch)
tree32b082efa178bc6b19b13af6252746ded94384b7 /llvm/tools/llvm-objcopy/llvm-objcopy.cpp
parent1e9c00308b0d2b128cc192fce1d2a5bb33ac9ac0 (diff)
downloadllvm-7439a9a921123ca84fa8a07bf138fc0552ebeb0a.zip
llvm-7439a9a921123ca84fa8a07bf138fc0552ebeb0a.tar.gz
llvm-7439a9a921123ca84fa8a07bf138fc0552ebeb0a.tar.bz2
[llvm-objcopy] Change handling of output file permissions
Summary: Address bug [[ https://bugs.llvm.org/show_bug.cgi?id=42082 | 42082 ]] where files were always outputted with 0775 permissions. Now, the output file is given either 0666 or 0777 if the object is executable. Reviewers: espindola, alexshap, rupprecht, jhenderson, jakehehrlich, MaskRay Reviewed By: rupprecht, jhenderson, jakehehrlich, MaskRay Subscribers: emaste, arichardson, jakehehrlich, MaskRay, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D62718 llvm-svn: 365162
Diffstat (limited to 'llvm/tools/llvm-objcopy/llvm-objcopy.cpp')
-rw-r--r--llvm/tools/llvm-objcopy/llvm-objcopy.cpp36
1 files changed, 26 insertions, 10 deletions
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 2ab77ea..db5609e 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -196,16 +196,26 @@ static Error executeObjcopyOnArchive(const CopyConfig &Config,
Config.DeterministicArchives, Ar.isThin());
}
-static Error restoreDateOnFile(StringRef Filename,
- const sys::fs::file_status &Stat) {
+static Error restoreStatOnFile(StringRef Filename,
+ const sys::fs::file_status &Stat,
+ bool PreserveDates) {
int FD;
+ // Writing to stdout should not be treated as an error here, just
+ // do not set access/modification times or permissions.
+ if (Filename == "-")
+ return Error::success();
+
if (auto EC =
sys::fs::openFileForWrite(Filename, FD, sys::fs::CD_OpenExisting))
return createFileError(Filename, EC);
- if (auto EC = sys::fs::setLastAccessAndModificationTime(
- FD, Stat.getLastAccessedTime(), Stat.getLastModificationTime()))
+ if (PreserveDates)
+ if (auto EC = sys::fs::setLastAccessAndModificationTime(
+ FD, Stat.getLastAccessedTime(), Stat.getLastModificationTime()))
+ return createFileError(Filename, EC);
+
+ if (auto EC = sys::fs::setPermissions(Filename, Stat.permissions()))
return createFileError(Filename, EC);
if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
@@ -219,9 +229,12 @@ static Error restoreDateOnFile(StringRef Filename,
/// format-agnostic modifications, i.e. preserving dates.
static Error executeObjcopy(const CopyConfig &Config) {
sys::fs::file_status Stat;
- if (Config.PreserveDates)
+ if (Config.InputFilename != "-") {
if (auto EC = sys::fs::status(Config.InputFilename, Stat))
return createFileError(Config.InputFilename, EC);
+ } else {
+ Stat.permissions(static_cast<sys::fs::perms>(0777));
+ }
typedef Error (*ProcessRawFn)(const CopyConfig &, MemoryBuffer &, Buffer &);
auto ProcessRaw = StringSwitch<ProcessRawFn>(Config.InputFormat)
@@ -253,12 +266,15 @@ static Error executeObjcopy(const CopyConfig &Config) {
}
}
- if (Config.PreserveDates) {
- if (Error E = restoreDateOnFile(Config.OutputFilename, Stat))
+ if (Error E =
+ restoreStatOnFile(Config.OutputFilename, Stat, Config.PreserveDates))
+ return E;
+
+ if (!Config.SplitDWO.empty()) {
+ Stat.permissions(static_cast<sys::fs::perms>(0666));
+ if (Error E =
+ restoreStatOnFile(Config.SplitDWO, Stat, Config.PreserveDates))
return E;
- if (!Config.SplitDWO.empty())
- if (Error E = restoreDateOnFile(Config.SplitDWO, Stat))
- return E;
}
return Error::success();