Handle case that symlink exists at target path for exclusive file creation
- fixes #263
diff --git a/fake_filesystem_test.py b/fake_filesystem_test.py
index 2374f3d..ab4bd0e 100755
--- a/fake_filesystem_test.py
+++ b/fake_filesystem_test.py
@@ -2759,6 +2759,16 @@
self.assertRaisesIOError(errno.EEXIST, self.os.open, file_path,
os.O_RDWR | os.O_EXCL | os.O_CREAT)
+ @unittest.skipIf(sys.version_info < (3, 3), 'Exclusive mode new in Python 3.3')
+ def testLowLevelOpenExclusiveRaisesIfSymlinkExists(self):
+ base_path = '/foo/bar'
+ self.filesystem.CreateDirectory(base_path)
+ link_path = base_path + '/link'
+ link_target = base_path + '/link_target'
+ self.os.symlink(link_target, link_path)
+ self.assertRaisesOSError(errno.EEXIST, self.os.open, link_path,
+ os.O_CREAT | os.O_WRONLY | os.O_TRUNC | os.O_EXCL)
+
def testOpenDirectoryRaisesUnderWindows(self):
self.filesystem.is_windows_fs = True
dir_path = '/dir'
diff --git a/pyfakefs/fake_filesystem.py b/pyfakefs/fake_filesystem.py
index c086f7d..e15fb96 100644
--- a/pyfakefs/fake_filesystem.py
+++ b/pyfakefs/fake_filesystem.py
@@ -4375,12 +4375,12 @@
closefd = True
error_class = OSError if self.low_level else IOError
+ if must_not_exist and (file_object or self.filesystem.IsLink(file_path)):
+ raise error_class(errno.EEXIST, 'File exists', file_path)
if file_object:
if ((need_read and not file_object.st_mode & PERM_READ) or
(need_write and not file_object.st_mode & PERM_WRITE)):
raise error_class(errno.EACCES, 'Permission denied', file_path)
- if must_not_exist:
- raise error_class(errno.EEXIST, 'File exists', file_path)
if need_write:
if truncate:
file_object.SetContents('')