diff --git a/src/borg/archive.py b/src/borg/archive.py index 6fc0739e2..9cab897de 100644 --- a/src/borg/archive.py +++ b/src/borg/archive.py @@ -688,7 +688,10 @@ Utilization of max. archive size: {csize_max:.0%} try: xattr.setxattr(fd or path, k, v, follow_symlinks=False) except OSError as e: - if e.errno not in (errno.ENOTSUP, errno.EACCES): + if e.errno == errno.E2BIG: + logger.warning('%s: Value or key of extended attribute %s is too big for this filesystem' % + (path, k.decode())) + elif e.errno not in (errno.ENOTSUP, errno.EACCES): # only raise if the errno is not on our ignore list: # ENOTSUP == xattrs not supported here # EACCES == permission denied to set this specific xattr diff --git a/src/borg/testsuite/archiver.py b/src/borg/testsuite/archiver.py index 1bff8d5b3..a8f4d95a5 100644 --- a/src/borg/testsuite/archiver.py +++ b/src/borg/testsuite/archiver.py @@ -1046,6 +1046,21 @@ class ArchiverTestCase(ArchiverTestCaseBase): self.cmd('extract', self.repository_location + '::test') assert xattr.getxattr('input/file', 'security.capability') == capabilities + @pytest.mark.skipif(not xattr.XATTR_FAKEROOT, reason='xattr not supported on this system or on this version of' + 'fakeroot') + def test_extract_big_xattrs(self): + def patched_setxattr(*args, **kwargs): + raise OSError(errno.E2BIG, 'E2BIG') + self.create_regular_file('file') + xattr.setxattr('input/file', 'attribute', 'value') + self.cmd('init', self.repository_location, '-e' 'none') + self.cmd('create', self.repository_location + '::test', 'input') + with changedir('output'): + with patch.object(xattr, 'setxattr', patched_setxattr): + out = self.cmd('extract', self.repository_location + '::test', exit_code=EXIT_WARNING) + assert out == (os.path.abspath('input/file') + ': Value or key of extended attribute attribute is too big' + 'for this filesystem\n') + def test_path_normalization(self): self.cmd('init', '--encryption=repokey', self.repository_location) self.create_regular_file('dir1/dir2/file', size=1024 * 80)