#17076: Make copying of xattrs more permissive of missing FS support

Patch by Thomas Wouters.
diff --git a/Lib/shutil.py b/Lib/shutil.py
index e4b640c..a188408 100644
--- a/Lib/shutil.py
+++ b/Lib/shutil.py
@@ -142,7 +142,13 @@
 
         """
 
-        for name in os.listxattr(src, follow_symlinks=follow_symlinks):
+        try:
+            names = os.listxattr(src, follow_symlinks=follow_symlinks)
+        except OSError as e:
+            if e.errno not in (errno.ENOTSUP, errno.ENODATA):
+                raise
+            return
+        for name in names:
             try:
                 value = os.getxattr(src, name, follow_symlinks=follow_symlinks)
                 os.setxattr(dst, name, value, follow_symlinks=follow_symlinks)
diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py
index 8ac350a..3b1b694 100644
--- a/Lib/test/test_shutil.py
+++ b/Lib/test/test_shutil.py
@@ -449,6 +449,17 @@
             self.assertIn('user.bar', os.listxattr(dst))
         finally:
             os.setxattr = orig_setxattr
+        # the source filesystem not supporting xattrs should be ok, too.
+        def _raise_on_src(fname, *, follow_symlinks=True):
+            if fname == src:
+                raise OSError(errno.ENOTSUP, 'Operation not supported')
+            return orig_listxattr(fname, follow_symlinks=follow_symlinks)
+        try:
+            orig_listxattr = os.listxattr
+            os.listxattr = _raise_on_src
+            shutil._copyxattr(src, dst)
+        finally:
+            os.listxattr = orig_listxattr
 
         # test that shutil.copystat copies xattrs
         src = os.path.join(tmp_dir, 'the_original')
diff --git a/Misc/NEWS b/Misc/NEWS
index ce24d0e..122b228 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -163,6 +163,9 @@
 Library
 -------
 
+- Issue #17076: Make copying of xattrs more permissive of missing FS support.
+  Patch by Thomas Wouters.
+
 - Issue #17089: Expat parser now correctly works with string input not only when
   an internal XML encoding is UTF-8 or US-ASCII.  It now accepts bytes and
   strings larger than 2 GiB.