diff options
author | Jian Cai <jiancai@google.com> | 2021-02-02 18:47:03 -0800 |
---|---|---|
committer | Jian Cai <jiancai@google.com> | 2021-02-12 18:01:43 -0800 |
commit | c2a84771bb63947695ea50b89160c02b36fb634d (patch) | |
tree | cef9522e99bd7058bf4e3e731a854dbe740e2d92 /llvm/tools/llvm-objcopy/llvm-objcopy.cpp | |
parent | 5631842d181016207e85e4d035d0c4383f34337a (diff) | |
download | llvm-c2a84771bb63947695ea50b89160c02b36fb634d.zip llvm-c2a84771bb63947695ea50b89160c02b36fb634d.tar.gz llvm-c2a84771bb63947695ea50b89160c02b36fb634d.tar.bz2 |
[llvm-objcopy] preserve file ownership when overwritten by root
As of binutils 2.36, GNU strip calls chown(2) for "sudo strip foo" and
"sudo strip foo -o foo", but no "sudo strip foo -o bar" or "sudo strip
foo -o ./foo". In other words, while "sudo strip foo -o bar" creates a
new file bar with root access, "sudo strip foo" will keep the owner and
group of foo unchanged. Currently llvm-objcopy and llvm-strip behave
differently, always changing the owner and gropu to root. The
discrepancy prevents Chrome OS from migrating to llvm-objcopy and
llvm-strip as they change file ownership and cause intended users/groups
to lose access when invoked by sudo with the following sequence
(recommended in man page of GNU strip).
1.<Link the executable as normal.>
1.<Copy "foo" to "foo.full">
1.<Run "strip --strip-debug foo">
1.<Run "objcopy --add-gnu-debuglink=foo.full foo">
This patch makes llvm-objcopy and llvm-strip follow GNU's behavior.
Link: crbug.com/1108880
Diffstat (limited to 'llvm/tools/llvm-objcopy/llvm-objcopy.cpp')
-rw-r--r-- | llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp index 7fd2acd..42d97b2 100644 --- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp @@ -310,7 +310,10 @@ static Error executeObjcopy(CopyConfig &Config) { if (Error E = executeObjcopyOnArchive(Config, *Ar)) return E; } else { - FileBuffer FB(Config.OutputFilename); + FileBuffer FB(Config.OutputFilename, + Config.InputFilename != "-" && + Config.InputFilename == Config.OutputFilename, + Stat.getUser(), Stat.getGroup()); if (Error E = executeObjcopyOnBinary(Config, *BinaryOrErr.get().getBinary(), FB)) return E; |