mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-23 20:34:58 +00:00
[Support] Make sure sys::fs::remove can remove symbolic links and make sure LockFileManager can handle a symbolic link that points nowhere.
llvm-svn: 204422
This commit is contained in:
parent
239d7d1128
commit
01f7e30c52
@ -29,16 +29,13 @@ using namespace llvm;
|
|||||||
/// \returns The process ID of the process that owns this lock file
|
/// \returns The process ID of the process that owns this lock file
|
||||||
Optional<std::pair<std::string, int> >
|
Optional<std::pair<std::string, int> >
|
||||||
LockFileManager::readLockFile(StringRef LockFileName) {
|
LockFileManager::readLockFile(StringRef LockFileName) {
|
||||||
// Check whether the lock file exists. If not, clearly there's nothing
|
|
||||||
// to read, so we just return.
|
|
||||||
if (!sys::fs::exists(LockFileName))
|
|
||||||
return None;
|
|
||||||
|
|
||||||
// Read the owning host and PID out of the lock file. If it appears that the
|
// Read the owning host and PID out of the lock file. If it appears that the
|
||||||
// owning process is dead, the lock file is invalid.
|
// owning process is dead, the lock file is invalid.
|
||||||
std::unique_ptr<MemoryBuffer> MB;
|
std::unique_ptr<MemoryBuffer> MB;
|
||||||
if (MemoryBuffer::getFile(LockFileName, MB))
|
if (MemoryBuffer::getFile(LockFileName, MB)) {
|
||||||
|
sys::fs::remove(LockFileName);
|
||||||
return None;
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
StringRef Hostname;
|
StringRef Hostname;
|
||||||
StringRef PIDStr;
|
StringRef PIDStr;
|
||||||
|
@ -305,7 +305,7 @@ error_code remove(const Twine &path, bool IgnoreNonExisting) {
|
|||||||
StringRef p = path.toNullTerminatedStringRef(path_storage);
|
StringRef p = path.toNullTerminatedStringRef(path_storage);
|
||||||
|
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
if (stat(p.begin(), &buf) != 0) {
|
if (lstat(p.begin(), &buf) != 0) {
|
||||||
if (errno != errc::no_such_file_or_directory || !IgnoreNonExisting)
|
if (errno != errc::no_such_file_or_directory || !IgnoreNonExisting)
|
||||||
return error_code(errno, system_category());
|
return error_code(errno, system_category());
|
||||||
return error_code::success();
|
return error_code::success();
|
||||||
@ -316,7 +316,7 @@ error_code remove(const Twine &path, bool IgnoreNonExisting) {
|
|||||||
// check ensures that what we're trying to erase is a regular file. It
|
// check ensures that what we're trying to erase is a regular file. It
|
||||||
// effectively prevents LLVM from erasing things like /dev/null, any block
|
// effectively prevents LLVM from erasing things like /dev/null, any block
|
||||||
// special file, or other things that aren't "regular" files.
|
// special file, or other things that aren't "regular" files.
|
||||||
if (!S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode))
|
if (!S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode) && !S_ISLNK(buf.st_mode))
|
||||||
return make_error_code(errc::operation_not_permitted);
|
return make_error_code(errc::operation_not_permitted);
|
||||||
|
|
||||||
if (::remove(p.begin()) == -1) {
|
if (::remove(p.begin()) == -1) {
|
||||||
|
@ -44,4 +44,36 @@ TEST(LockFileManagerTest, Basic) {
|
|||||||
ASSERT_FALSE(EC);
|
ASSERT_FALSE(EC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(LockFileManagerTest, LinkLockExists) {
|
||||||
|
SmallString<64> TmpDir;
|
||||||
|
error_code EC;
|
||||||
|
EC = sys::fs::createUniqueDirectory("LockFileManagerTestDir", TmpDir);
|
||||||
|
ASSERT_FALSE(EC);
|
||||||
|
|
||||||
|
SmallString<64> LockedFile(TmpDir);
|
||||||
|
sys::path::append(LockedFile, "file");
|
||||||
|
|
||||||
|
SmallString<64> FileLocK(TmpDir);
|
||||||
|
sys::path::append(FileLocK, "file.lock");
|
||||||
|
|
||||||
|
SmallString<64> TmpFileLock(TmpDir);
|
||||||
|
sys::path::append(TmpFileLock, "file.lock-000");
|
||||||
|
|
||||||
|
EC = sys::fs::create_link(TmpFileLock.str(), FileLocK.str());
|
||||||
|
ASSERT_FALSE(EC);
|
||||||
|
|
||||||
|
{
|
||||||
|
// The lock file doesn't point to a real file, so we should successfully
|
||||||
|
// acquire it.
|
||||||
|
LockFileManager Locked(LockedFile);
|
||||||
|
EXPECT_EQ(LockFileManager::LFS_Owned, Locked.getState());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now that the lock is out of scope, the file should be gone.
|
||||||
|
EXPECT_FALSE(sys::fs::exists(StringRef(LockedFile)));
|
||||||
|
|
||||||
|
EC = sys::fs::remove(StringRef(TmpDir));
|
||||||
|
ASSERT_FALSE(EC);
|
||||||
|
}
|
||||||
|
|
||||||
} // end anonymous namespace
|
} // end anonymous namespace
|
||||||
|
Loading…
x
Reference in New Issue
Block a user