[3.14] gh-127146: Emscripten: Fix pathlib glob_dotdot test (GH-135624) (#135653)

The Emscripten path resolver uses the same mechanism for resolving `..`
at a file system root as for resolving symlinks. This is because
roots don't store their mountpoints. If the parent of a node is itself,
it is a root but it might be a mountpoint in some other file system.

If a path has enough `..`'s at the root, it will return ELOOP.
Enough turns out to be 49.
(cherry picked from commit e4ccd46bf7)

Co-authored-by: Hood Chatham <roberthoodchatham@gmail.com>
This commit is contained in:
Miss Islington (bot) 2025-06-18 06:19:43 +02:00 committed by GitHub
parent a61bd7af6e
commit 9f63a54aec
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2954,7 +2954,13 @@ class PathTest(PurePathTest):
else:
# ".." segments are normalized first on Windows, so this path is stat()able.
self.assertEqual(set(p.glob("xyzzy/..")), { P(self.base, "xyzzy", "..") })
self.assertEqual(set(p.glob("/".join([".."] * 50))), { P(self.base, *[".."] * 50)})
if sys.platform == "emscripten":
# Emscripten will return ELOOP if there are 49 or more ..'s.
# Can remove when https://github.com/emscripten-core/emscripten/pull/24591 is merged.
NDOTDOTS = 48
else:
NDOTDOTS = 50
self.assertEqual(set(p.glob("/".join([".."] * NDOTDOTS))), { P(self.base, *[".."] * NDOTDOTS)})
def test_glob_inaccessible(self):
P = self.cls