This is an archive of the discontinued LLVM Phabricator instance.

Do not remove a target file in FileOutputBuffer::create().
ClosedPublic

Authored by ruiu on Sep 26 2017, 10:35 AM.

Details

Summary

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.

Event Timeline

ruiu created this revision.Sep 26 2017, 10:35 AM
This revision was automatically updated to reflect the committed changes.

Hi Ruiu,

I like this change however, it causes a change in behaviour in lld. Please take a look at: https://reviews.llvm.org/D38401.