diff --git a/llvm/include/llvm/Support/FileOutputBuffer.h b/llvm/include/llvm/Support/FileOutputBuffer.h --- a/llvm/include/llvm/Support/FileOutputBuffer.h +++ b/llvm/include/llvm/Support/FileOutputBuffer.h @@ -34,9 +34,6 @@ /// Don't use mmap and instead write an in-memory buffer to a file when this /// buffer is closed. F_no_mmap = 2, - - /// Preserve ownership if the file already exists. - F_keep_ownership = 4, }; /// Factory method to create an OutputBuffer object which manages a read/write @@ -49,8 +46,7 @@ /// \p Size. It is an error to specify F_modify and Size=-1 if \p FilePath /// does not exist. static Expected> - create(StringRef FilePath, size_t Size, unsigned Flags = 0, - unsigned UserID = 0, unsigned GroupID = 0); + create(StringRef FilePath, size_t Size, unsigned Flags = 0); /// Returns a pointer to the start of the buffer. virtual uint8_t *getBufferStart() const = 0; diff --git a/llvm/lib/Support/FileOutputBuffer.cpp b/llvm/lib/Support/FileOutputBuffer.cpp --- a/llvm/lib/Support/FileOutputBuffer.cpp +++ b/llvm/lib/Support/FileOutputBuffer.cpp @@ -125,8 +125,7 @@ } static Expected> -createOnDiskBuffer(StringRef Path, size_t Size, unsigned Mode, - bool KeepOwnership, unsigned UserID, unsigned GroupID) { +createOnDiskBuffer(StringRef Path, size_t Size, unsigned Mode) { Expected FileOrErr = fs::TempFile::create(Path + ".tmp%%%%%%%", Mode); if (!FileOrErr) @@ -134,13 +133,6 @@ fs::TempFile File = std::move(*FileOrErr); #ifndef _WIN32 - // Try to preserve file ownership if requested. - if (KeepOwnership) { - fs::file_status Stat; - if (!fs::status(File.FD, Stat) && Stat.getUser() == 0) - fs::changeFileOwnership(File.FD, UserID, GroupID); - } - // On Windows, CreateFileMapping (the mmap function on Windows) // automatically extends the underlying file. We don't need to // extend the file beforehand. _chsize (ftruncate on Windows) is @@ -171,8 +163,7 @@ // Create an instance of FileOutputBuffer. Expected> -FileOutputBuffer::create(StringRef Path, size_t Size, unsigned Flags, - unsigned UserID, unsigned GroupID) { +FileOutputBuffer::create(StringRef Path, size_t Size, unsigned Flags) { // Handle "-" as stdout just like llvm::raw_ostream does. if (Path == "-") return createInMemoryBuffer("-", Size, /*Mode=*/0); @@ -205,8 +196,7 @@ if (Flags & F_no_mmap) return createInMemoryBuffer(Path, Size, Mode); else - return createOnDiskBuffer(Path, Size, Mode, Flags & F_keep_ownership, - UserID, GroupID); + return createOnDiskBuffer(Path, Size, Mode); default: return createInMemoryBuffer(Path, Size, Mode); } diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.h b/llvm/tools/llvm-objcopy/llvm-objcopy.h --- a/llvm/tools/llvm-objcopy/llvm-objcopy.h +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.h @@ -31,13 +31,9 @@ /// \p OutputFileName: std::outs for the "-", raw_null_ostream for /// the "/dev/null", temporary file in the same directory as the final output /// file for other names. The final output file is atomically replaced with -/// the temporary file after \p Write handler is finished. \p KeepOwnership -/// used to setting specified \p UserID and \p GroupID for the resulting file -/// if writeToFile is called under /root. +/// the temporary file after \p Write handler is finished. Error writeToFile(StringRef OutputFileName, - std::function Write, - bool KeepOwnership = false, unsigned UserID = 0, - unsigned GroupID = 0); + std::function Write); } // end namespace objcopy } // end namespace llvm diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp --- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp @@ -58,8 +58,7 @@ namespace objcopy { Error writeToFile(StringRef OutputFileName, - std::function Write, bool KeepOwnership, - unsigned UserID, unsigned GroupID) { + std::function Write) { if (OutputFileName == "-") return Write(outs()); @@ -74,15 +73,6 @@ if (!Temp) return createFileError(OutputFileName, Temp.takeError()); -#ifndef _WIN32 - // Try to preserve file ownership if requested. - if (KeepOwnership) { - sys::fs::file_status Stat; - if (!sys::fs::status(Temp->FD, Stat) && Stat.getUser() == 0) - sys::fs::changeFileOwnership(Temp->FD, UserID, GroupID); - } -#endif - raw_fd_ostream Out(Temp->FD, false); if (Error E = Write(Out)) { @@ -156,9 +146,9 @@ // now in-memory buffers can not be completely avoided since // NewArchiveMember still requires them even though writeArchive does not // write them on disk. - Expected> FB = FileOutputBuffer::create( - Member.MemberName, Member.Buf->getBufferSize(), - FileOutputBuffer::F_executable | FileOutputBuffer::F_keep_ownership); + Expected> FB = + FileOutputBuffer::create(Member.MemberName, Member.Buf->getBufferSize(), + FileOutputBuffer::F_executable); if (!FB) return FB.takeError(); std::copy(Member.Buf->getBufferStart(), Member.Buf->getBufferEnd(), @@ -306,6 +296,12 @@ if (auto EC = sys::fs::setPermissions(FD, Perm)) #endif return createFileError(Filename, EC); + +#ifndef _WIN32 + // Keep ownership if llvm-objcopy is called under root. + if (Config.InputFilename == Config.OutputFilename && OStat.getUser() == 0) + sys::fs::changeFileOwnership(FD, Stat.getUser(), Stat.getGroup()); +#endif } if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD)) @@ -360,14 +356,10 @@ return E; } else { if (Error E = writeToFile( - Config.OutputFilename, - [&](raw_ostream &OutFile) -> Error { + Config.OutputFilename, [&](raw_ostream &OutFile) -> Error { return executeObjcopyOnBinary( Config, *BinaryOrErr.get().getBinary(), OutFile); - }, - Config.InputFilename != "-" && - Config.InputFilename == Config.OutputFilename, - Stat.getUser(), Stat.getGroup())) + })) return E; } }