[PATCH] D38283: Do not remove a target file in FileOutputBuffer::create().
Zachary Turner via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 26 16:30:25 PDT 2017
I don’t think this will replace an existing file will it? It looks like it
will fail if the file already exists
On Tue, Sep 26, 2017 at 3:31 PM Rui Ueyama via Phabricator <
reviews at reviews.llvm.org> wrote:
> ruiu created this revision.
> Herald added a subscriber: hiraditya.
>
> FileOutputBuffer::create() attempts to remove a target file if the file
> is a regular one, which results in an unexpected result in a failure
> scenario.
>
> If something goes wrong and the user of FileOutputBuffer decides to not
> call commit(), it leaves nothing. An existing file was removed, and no
> new file was created.
>
> What we should do is to atomically replace an existing file with a new
> file using rename(), so that it wouldn't remove an existing file without
> creating a new one.
>
>
> https://reviews.llvm.org/D38283
>
> Files:
> llvm/lib/Support/FileOutputBuffer.cpp
>
>
> Index: llvm/lib/Support/FileOutputBuffer.cpp
> ===================================================================
> --- llvm/lib/Support/FileOutputBuffer.cpp
> +++ llvm/lib/Support/FileOutputBuffer.cpp
> @@ -65,13 +65,6 @@
> IsRegular = false;
> }
>
> - if (IsRegular) {
> - // Delete target file.
> - EC = sys::fs::remove(FilePath);
> - if (EC)
> - return EC;
> - }
> -
> SmallString<128> TempFilePath;
> int FD;
> if (IsRegular) {
> @@ -125,7 +118,7 @@
>
> std::error_code EC;
> if (IsRegular) {
> - // Rename file to final name.
> + // Atomically replace the existing file with the new one.
> EC = sys::fs::rename(Twine(TempPath), Twine(FinalPath));
> sys::DontRemoveFileOnSignal(TempPath);
> } else {
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170926/7ef621ed/attachment.html>
More information about the llvm-commits
mailing list