diff --git a/Lib/site.py b/Lib/site.py index 2517b7e5f1d22a..e289fba74b4663 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -176,6 +176,18 @@ def addpackage(sitedir, name, known_paths): except OSError: return with f: + if name.startswith("._"): + # MacOS will create "._" files next to a regular file + # when a filesystem driver needs to store metadata that + # cannot be stored natively. Such files are encoded + # in AppleDouble format. + # The test looks for the magic marker at the start of such + # files. + if f.buffer.read(4) == b"\x00\x05\x16\x07" \ + and os.path.exists(os.path.join(sitedir, name[2:])): + return + f.seek(0) + for n, line in enumerate(f): if line.startswith("#"): continue diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 33d0975bda8eaa..b194693dad4c3f 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -181,6 +181,27 @@ def test_addpackage_import_bad_pth_file(self): if isinstance(path, str): self.assertNotIn("abc\x00def", path) + def test_addpackage_macOS_resources(self): + # GH-113356 + pth_dir, pth_fn = self.make_pth("dummy\n") + resource_fork = os.path.join(pth_dir, "._" + pth_fn) + with open(resource_fork, "wb") as fp: + self.addCleanup(lambda: os.remove(resource_fork)) + + # The bytes below were generated on macOS 14 using an + # exFAT filesystem. Command to write an xattr: + # `xattr -w key value test.txt`. These bytes are not + # the complete AppleDouble file, but just a significant + # prefix. + fp.write(b'\x00\x05\x16\x07\x00\x02\x00\x00Mac OS X ') + fp.write(b'\x00\x02\x00\x00\x00\t\x00\x00\x002\x00\x00\x0e') + fp.write(b'\xb0\x00\x00\x00\x02\x00\x00\x0e\xe2\x00\x00') + fp.write(b'\x01\x1e') + + with captured_stderr() as err_out: + self.assertFalse(site.addpackage(pth_dir, "._" + pth_fn, set())) + self.assertEqual(err_out.getvalue(), "") + def test_addsitedir(self): # Same tests for test_addpackage since addsitedir() essentially just # calls addpackage() for every .pth file in the directory diff --git a/Misc/NEWS.d/next/macOS/2023-12-21-14-18-24.gh-issue-113356.Vz2osH.rst b/Misc/NEWS.d/next/macOS/2023-12-21-14-18-24.gh-issue-113356.Vz2osH.rst new file mode 100644 index 00000000000000..472e8a2b8bb7d9 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2023-12-21-14-18-24.gh-issue-113356.Vz2osH.rst @@ -0,0 +1,3 @@ +Ignore "._" prefixed pth files when those cannot be parsed. These files are +created on macOS when the system tries store metadata that is not supported +by the filesystem (such as extended attributes on exFAT)