Explorar el Código

Merge pull request #5592 from ThomasWaldmann/extract-xattr-eperm-master

extract: improve setxattr exception handling
TW hace 4 años
padre
commit
050a705010
Se han modificado 2 ficheros con 12 adiciones y 12 borrados
  1. 3 3
      src/borg/testsuite/archiver.py
  2. 9 9
      src/borg/xattr.py

+ 3 - 3
src/borg/testsuite/archiver.py

@@ -1370,15 +1370,15 @@ class ArchiverTestCase(ArchiverTestCaseBase):
             input_abspath = os.path.abspath('input/file')
             with patch.object(xattr, 'setxattr', patched_setxattr_E2BIG):
                 out = self.cmd('extract', self.repository_location + '::test', exit_code=EXIT_WARNING)
-                assert '>: Value or key of extended attribute user.attribute is too big for this filesystem\n' in out
+                assert ': when setting extended attribute user.attribute: too big for this filesystem\n' in out
             os.remove(input_abspath)
             with patch.object(xattr, 'setxattr', patched_setxattr_ENOTSUP):
                 out = self.cmd('extract', self.repository_location + '::test', exit_code=EXIT_WARNING)
-                assert '>: Extended attributes are not supported on this filesystem\n' in out
+                assert ': when setting extended attribute user.attribute: xattrs not supported on this filesystem\n' in out
             os.remove(input_abspath)
             with patch.object(xattr, 'setxattr', patched_setxattr_EACCES):
                 out = self.cmd('extract', self.repository_location + '::test', exit_code=EXIT_WARNING)
-                assert '>: Permission denied when setting extended attribute user.attribute\n' in out
+                assert ': when setting extended attribute user.attribute: Permission denied\n' in out
             assert os.path.isfile(input_abspath)
 
     def test_path_normalization(self):

+ 9 - 9
src/borg/xattr.py

@@ -133,19 +133,19 @@ def set_all(path, xattrs, follow_symlinks=False):
                 path_str = '<FD %d>' % path
             else:
                 path_str = os.fsdecode(path)
+            msg_format = '%s: when setting extended attribute %s: %%s' % (path_str, k_str)
             if e.errno == errno.E2BIG:
-                logger.warning('%s: Value or key of extended attribute %s is too big for this filesystem' % (
-                               path_str, k_str))
+                err_str = 'too big for this filesystem'
             elif e.errno == errno.ENOTSUP:
-                logger.warning('%s: Extended attributes are not supported on this filesystem' % path_str)
-            elif e.errno == errno.EACCES:
-                # permission denied to set this specific xattr (this may happen related to security.* keys)
-                logger.warning('%s: Permission denied when setting extended attribute %s' % (path_str, k_str))
+                err_str = 'xattrs not supported on this filesystem'
             elif e.errno == errno.ENOSPC:
                 # ext4 reports ENOSPC when trying to set an xattr with >4kiB while ext4 can only support 4kiB xattrs
                 # (in this case, this is NOT a "disk full" error, just a ext4 limitation).
-                logger.warning('%s: No space left on device while setting extended attribute %s (len = %d)' % (
-                               path_str, k_str, len(v)))
+                err_str = 'no space left on device [xattr len = %d]' % (len(v),)
             else:
-                raise
+                # generic handler
+                # EACCES: permission denied to set this specific xattr (this may happen related to security.* keys)
+                # EPERM: operation not permitted
+                err_str = os.strerror(e.errno)
+            logger.warning(msg_format % err_str)
     return warning