From: Reid Spencer Date: Wed, 15 Dec 2004 08:32:45 +0000 (+0000) Subject: Fix a file overwrite bug in llvm-ar introduced by changes to X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=07f9f4e2a41ed5b431b69165890ad9bc6f44edde;p=oota-llvm.git Fix a file overwrite bug in llvm-ar introduced by changes to createTemporaryFile semantics where it doesn't create a fully unique name if the basename doesn't exist. This functionality is now optionally provided by the boolean reuse_current parameter to createTemporaryFile and makeUnique. The default values differ because of the way these functions are used in LLVM. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18961 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/System/Path.h b/include/llvm/System/Path.h index 0e757f5c4e1..5be47b21bac 100644 --- a/include/llvm/System/Path.h +++ b/include/llvm/System/Path.h @@ -494,7 +494,7 @@ namespace sys { /// already unique. /// @throws std::string if an unrecoverable error occurs. /// @brief Make the current path name unique in the file system. - void makeUnique(); + void makeUnique( bool reuse_current = true ); /// This method attempts to create a directory in the file system with the /// same name as the Path object. The \p create_parents parameter controls @@ -529,7 +529,7 @@ namespace sys { /// the newly generated temporary file name is unique in the file system. /// @throws std::string if there is an error /// @brief Create a unique temporary file - bool createTemporaryFile(); + bool createTemporaryFile(bool reuse_current = false); /// This method attempts to destroy the directory named by the last in /// the Path name. If \p remove_contents is false, an attempt will be diff --git a/lib/System/Unix/Path.cpp b/lib/System/Unix/Path.cpp index d4bf0260c56..84c2d2d23d5 100644 --- a/lib/System/Unix/Path.cpp +++ b/lib/System/Unix/Path.cpp @@ -481,13 +481,13 @@ Path::createFile() { } bool -Path::createTemporaryFile() { +Path::createTemporaryFile(bool reuse_current) { // Make sure we're dealing with a file if (!isFile()) return false; // Make this into a unique file name - makeUnique(); + makeUnique( reuse_current ); // create the file int outFile = ::open(path.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0666); @@ -600,8 +600,8 @@ CopyFile(const sys::Path &Dest, const sys::Path &Src) { } void -Path::makeUnique() { - if (!exists()) +Path::makeUnique(bool reuse_current) { + if (reuse_current && !exists()) return; // File doesn't exist already, just use it! // Append an XXXXXX pattern to the end of the file for use with mkstemp, diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc index d4bf0260c56..84c2d2d23d5 100644 --- a/lib/System/Unix/Path.inc +++ b/lib/System/Unix/Path.inc @@ -481,13 +481,13 @@ Path::createFile() { } bool -Path::createTemporaryFile() { +Path::createTemporaryFile(bool reuse_current) { // Make sure we're dealing with a file if (!isFile()) return false; // Make this into a unique file name - makeUnique(); + makeUnique( reuse_current ); // create the file int outFile = ::open(path.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0666); @@ -600,8 +600,8 @@ CopyFile(const sys::Path &Dest, const sys::Path &Src) { } void -Path::makeUnique() { - if (!exists()) +Path::makeUnique(bool reuse_current) { + if (reuse_current && !exists()) return; // File doesn't exist already, just use it! // Append an XXXXXX pattern to the end of the file for use with mkstemp, diff --git a/lib/System/Win32/Path.cpp b/lib/System/Win32/Path.cpp index 24cfc465181..21e07c8ae13 100644 --- a/lib/System/Win32/Path.cpp +++ b/lib/System/Win32/Path.cpp @@ -587,8 +587,8 @@ CopyFile(const sys::Path &Dest, const sys::Path &Src) { } void -Path::makeUnique() { - if (!exists()) +Path::makeUnique( bool reuse_current ) { + if (reuse_current && !exists()) return; // File doesn't exist already, just use it! Path dir (*this); @@ -602,6 +602,16 @@ Path::makeUnique() { path = newName; } +bool +Path::createTemporaryFile(bool reuse_current) { + // Make sure we're dealing with a file + if (!isFile()) + return false; + + // Make this into a unique file name + makeUnique( reuse_current ); +} + } } diff --git a/lib/System/Win32/Path.inc b/lib/System/Win32/Path.inc index 24cfc465181..21e07c8ae13 100644 --- a/lib/System/Win32/Path.inc +++ b/lib/System/Win32/Path.inc @@ -587,8 +587,8 @@ CopyFile(const sys::Path &Dest, const sys::Path &Src) { } void -Path::makeUnique() { - if (!exists()) +Path::makeUnique( bool reuse_current ) { + if (reuse_current && !exists()) return; // File doesn't exist already, just use it! Path dir (*this); @@ -602,6 +602,16 @@ Path::makeUnique() { path = newName; } +bool +Path::createTemporaryFile(bool reuse_current) { + // Make sure we're dealing with a file + if (!isFile()) + return false; + + // Make this into a unique file name + makeUnique( reuse_current ); +} + } }