Do not remove a target file in FileOutputBuffer::create().
authorRui Ueyama <ruiu@google.com>
Wed, 27 Sep 2017 21:19:24 +0000 (21:19 +0000)
committerRui Ueyama <ruiu@google.com>
Wed, 27 Sep 2017 21:19:24 +0000 (21:19 +0000)
commit23fa4de2db9e7e377d43abf44b8731aa7a16eb5b
tree7d0fbc515bab7f5d85ecc86828130b03d4cfa5fd
parentfa1ae3e862a6c2ee70948498c57234e95b3453c2
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

llvm-svn: 314345
llvm/lib/Support/FileOutputBuffer.cpp