[PATCH] D19838: [LLVM-AR] Fixed bug where temporary file would be left behind every time an archive was updated

Cameron via llvm-commits llvm-commits at lists.llvm.org
Mon May 2 15:21:42 PDT 2016


cameron314 created this revision.
cameron314 added a reviewer: Bigcheese.
cameron314 added a subscriber: llvm-commits.
cameron314 set the repository for this revision to rL LLVM.

When updating an existing archive, llvm-ar opens the old archive into a `MemoryBuffer`, does its thing, and writes the results to a temporary file. That file is then renamed to the original archive filename, thus replacing it with the updated contents. However, on Windows at least, what would happen is that the `MemoryBuffer` for the old archive would actually be an mmap'ed view of the file, so when it came time to do the rename via Win32's `ReplaceFile`, it would succeed but would be unable to fully replace the file since there would still be a handle open on it; instead, the old version got renamed to a random temporary name and left behind.

This patch fixes the problem by allowing the lifetime of the backing memory buffer to be tied to the lifetime of the old archive object, and destroying the archive object after it's no longer needed, just before the rename takes place.

Repository:
  rL LLVM

http://reviews.llvm.org/D19838

Files:
  include/llvm/Object/Archive.h
  include/llvm/Object/ArchiveWriter.h
  lib/Object/Archive.cpp
  lib/Object/ArchiveWriter.cpp
  tools/llvm-ar/llvm-ar.cpp

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D19838.55901.patch
Type: text/x-patch
Size: 6763 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160502/127100ed/attachment-0001.bin>


More information about the llvm-commits mailing list