diff --git a/docs/changelog/2794.bugfix.rst b/docs/changelog/2794.bugfix.rst new file mode 100644 index 000000000..598a87421 --- /dev/null +++ b/docs/changelog/2794.bugfix.rst @@ -0,0 +1 @@ +Ignore unreadable directories in ``PATH``. diff --git a/src/virtualenv/discovery/builtin.py b/src/virtualenv/discovery/builtin.py index 0b0d26b5d..5012667ab 100644 --- a/src/virtualenv/discovery/builtin.py +++ b/src/virtualenv/discovery/builtin.py @@ -171,7 +171,7 @@ def get_paths(env: Mapping[str, str]) -> Generator[Path, None, None]: if path: for p in map(Path, path.split(os.pathsep)): with suppress(OSError): - if p.exists(): + if next(p.iterdir(), None): yield p diff --git a/tests/unit/discovery/test_discovery.py b/tests/unit/discovery/test_discovery.py index c0156836b..b163be627 100644 --- a/tests/unit/discovery/test_discovery.py +++ b/tests/unit/discovery/test_discovery.py @@ -63,6 +63,11 @@ def test_discovery_via_path_not_found(tmp_path, monkeypatch): def test_discovery_via_path_in_nonbrowseable_directory(tmp_path, monkeypatch): bad_perm = tmp_path / "bad_perm" bad_perm.mkdir(mode=0o000) + # path entry is unreadable + monkeypatch.setenv("PATH", str(bad_perm)) + interpreter = get_interpreter(uuid4().hex, []) + assert interpreter is None + # path entry parent is unreadable monkeypatch.setenv("PATH", str(bad_perm / "bin")) interpreter = get_interpreter(uuid4().hex, []) assert interpreter is None