Parcourir la source

Merge pull request #3137 from ThomasWaldmann/dont-open-special

bsdflags support: skip blk/chr/lnk file type, fixes #3130
TW il y a 7 ans
Parent
commit
8909ffc71a
1 fichiers modifiés avec 9 ajouts et 2 suppressions
  1. 9 2
      src/borg/platform/linux.pyx

+ 9 - 2
src/borg/platform/linux.pyx

@@ -72,8 +72,11 @@ BSD_TO_LINUX_FLAGS = {
 
 
 def set_flags(path, bsd_flags, fd=None):
-    if fd is None and stat.S_ISLNK(os.lstat(path).st_mode):
-        return
+    if fd is None:
+        st = os.stat(path, follow_symlinks=False)
+        if stat.S_ISBLK(st.st_mode) or stat.S_ISCHR(st.st_mode) or stat.S_ISLNK(st.st_mode):
+            # see comment in get_flags()
+            return
     cdef int flags = 0
     for bsd_flag, linux_flag in BSD_TO_LINUX_FLAGS.items():
         if bsd_flags & bsd_flag:
@@ -92,6 +95,10 @@ def set_flags(path, bsd_flags, fd=None):
 
 
 def get_flags(path, st):
+    if stat.S_ISBLK(st.st_mode) or stat.S_ISCHR(st.st_mode) or stat.S_ISLNK(st.st_mode):
+        # avoid opening devices files - trying to open non-present devices can be rather slow.
+        # avoid opening symlinks, O_NOFOLLOW would make the open() fail anyway.
+        return 0
     cdef int linux_flags
     try:
         fd = os.open(path, os.O_RDONLY|os.O_NONBLOCK|os.O_NOFOLLOW)