diff --git a/src/borg/archive.py b/src/borg/archive.py index 9954eb70e..8337a974f 100644 --- a/src/borg/archive.py +++ b/src/borg/archive.py @@ -569,7 +569,7 @@ Utilization of max. archive size: {csize_max:.0%} path = os.path.join(dest, item.path) # Attempt to remove existing files, ignore errors on failure try: - st = os.lstat(path) + st = os.stat(path, follow_symlinks=False) if stat.S_ISDIR(st.st_mode): os.rmdir(path) else: diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 97f4425aa..8496e1d0c 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -436,7 +436,7 @@ class Archiver: continue path = os.path.normpath(path) try: - st = os.lstat(path) + st = os.stat(path, follow_symlinks=False) except OSError as e: self.print_warning('%s: %s', path, e) continue @@ -498,7 +498,7 @@ class Archiver: """ if st is None: with backup_io('stat'): - st = os.lstat(path) + st = os.stat(path, follow_symlinks=False) recurse_excluded_dir = False if not matcher.match(path): diff --git a/src/borg/helpers.py b/src/borg/helpers.py index b4090da9a..3367feaf5 100644 --- a/src/borg/helpers.py +++ b/src/borg/helpers.py @@ -1758,7 +1758,7 @@ class GenericDirEntry: def stat(self, follow_symlinks=True): assert not follow_symlinks - return os.lstat(self.path) + return os.stat(self.path, follow_symlinks=follow_symlinks) def _check_type(self, type): st = self.stat(False) diff --git a/src/borg/testsuite/__init__.py b/src/borg/testsuite/__init__.py index 38f5d4ab1..e6af9a29d 100644 --- a/src/borg/testsuite/__init__.py +++ b/src/borg/testsuite/__init__.py @@ -67,7 +67,7 @@ def are_symlinks_supported(): with unopened_tempfile() as filepath: try: os.symlink('somewhere', filepath) - if os.lstat(filepath) and os.readlink(filepath) == 'somewhere': + if os.stat(filepath, follow_symlinks=False) and os.readlink(filepath) == 'somewhere': return True except OSError: pass @@ -109,7 +109,7 @@ def is_utime_fully_supported(): open(filepath, 'w').close() try: os.utime(filepath, (1000, 2000), follow_symlinks=False) - new_stats = os.lstat(filepath) + new_stats = os.stat(filepath, follow_symlinks=False) if new_stats.st_atime == 1000 and new_stats.st_mtime == 2000: return True except OSError as err: @@ -158,8 +158,8 @@ class BaseTestCase(unittest.TestCase): for filename in diff.common: path1 = os.path.join(diff.left, filename) path2 = os.path.join(diff.right, filename) - s1 = os.lstat(path1) - s2 = os.lstat(path2) + s1 = os.stat(path1, follow_symlinks=False) + s2 = os.stat(path2, follow_symlinks=False) # Assume path2 is on FUSE if st_dev is different fuse = s1.st_dev != s2.st_dev attrs = ['st_uid', 'st_gid', 'st_rdev']