[llvm] r314345 - Do not remove a target file in FileOutputBuffer::create().
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 28 12:44:05 PDT 2017
Thanks!
Rui Ueyama via llvm-commits <llvm-commits at lists.llvm.org> writes:
> Author: ruiu
> Date: Wed Sep 27 14:19:24 2017
> New Revision: 314345
>
> URL: http://llvm.org/viewvc/llvm-project?rev=314345&view=rev
> Log:
> Do not remove a target file in FileOutputBuffer::create().
>
> 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 is removed, and no
> new file is 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.
>
> Differential Revision: https://reviews.llvm.org/D38283
>
> Modified:
> llvm/trunk/lib/Support/FileOutputBuffer.cpp
>
> Modified: llvm/trunk/lib/Support/FileOutputBuffer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FileOutputBuffer.cpp?rev=314345&r1=314344&r2=314345&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/FileOutputBuffer.cpp (original)
> +++ llvm/trunk/lib/Support/FileOutputBuffer.cpp Wed Sep 27 14:19:24 2017
> @@ -65,13 +65,6 @@ FileOutputBuffer::create(StringRef FileP
> 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 FileOutputBuffer::commit
>
> 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 {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list