From b3914e4472b2075fcfd4406cfc6dd83a3a801cea Mon Sep 17 00:00:00 2001 From: sepehrrasooli Date: Tue, 29 Jul 2025 10:21:59 +0330 Subject: [PATCH 1/7] Fix handling of TypeError exception when invalid version metadata entry is present --- src/pip/_internal/metadata/importlib/_dists.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/pip/_internal/metadata/importlib/_dists.py b/src/pip/_internal/metadata/importlib/_dists.py index 97363af9a55..4ba311b39a2 100644 --- a/src/pip/_internal/metadata/importlib/_dists.py +++ b/src/pip/_internal/metadata/importlib/_dists.py @@ -31,6 +31,7 @@ BasePath, get_dist_canonical_name, parse_name_and_version_from_info_directory, + BadMetadata, ) @@ -165,9 +166,16 @@ def canonical_name(self) -> NormalizedName: @property def version(self) -> Version: - if version := parse_name_and_version_from_info_directory(self._dist)[1]: + try: + version = ( + parse_name_and_version_from_info_directory(self._dist)[1] + or self._dist.version + ) return parse_version(version) - return parse_version(self._dist.version) + except TypeError: + raise BadMetadata( + self._dist.files[3], reason="invalid metadata entry `version`" + ) @property def raw_version(self) -> str: From a22bcbfee36d0f0b0942703ee5e1a146a22c422a Mon Sep 17 00:00:00 2001 From: sepehrrasooli Date: Tue, 29 Jul 2025 10:22:27 +0330 Subject: [PATCH 2/7] Show log message to inform user of malformed metadata --- src/pip/_internal/metadata/importlib/_envs.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pip/_internal/metadata/importlib/_envs.py b/src/pip/_internal/metadata/importlib/_envs.py index 71a73b7311f..04fb06b82d2 100644 --- a/src/pip/_internal/metadata/importlib/_envs.py +++ b/src/pip/_internal/metadata/importlib/_envs.py @@ -68,6 +68,8 @@ def _find_impl(self, location: str) -> Iterator[FoundResult]: info_location = get_info_location(dist) try: name = get_dist_canonical_name(dist) + distribution = Distribution(dist, info_location, None) + version = distribution.version except BadMetadata as e: logger.warning("Skipping %s due to %s", info_location, e.reason) continue From 238fac5cba091b2e498743401f659953d793d0ea Mon Sep 17 00:00:00 2001 From: sepehrrasooli Date: Tue, 29 Jul 2025 10:25:16 +0330 Subject: [PATCH 3/7] Add newsfile --- news/13443.bugfix.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 news/13443.bugfix.rst diff --git a/news/13443.bugfix.rst b/news/13443.bugfix.rst new file mode 100644 index 00000000000..e866d07debe --- /dev/null +++ b/news/13443.bugfix.rst @@ -0,0 +1,2 @@ +Handle malformed version metadata entires and ignore packages +with invalid ``Version`` instead of crashing. From 13f70d771bae32d7fe28bbfc1601abe3d17fcc7a Mon Sep 17 00:00:00 2001 From: sepehrrasooli Date: Tue, 29 Jul 2025 10:45:55 +0330 Subject: [PATCH 4/7] Fix pre-commit errors --- news/13443.bugfix.rst | 2 +- src/pip/_internal/metadata/importlib/_dists.py | 4 +--- src/pip/_internal/metadata/importlib/_envs.py | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/news/13443.bugfix.rst b/news/13443.bugfix.rst index e866d07debe..0ea95413bd1 100644 --- a/news/13443.bugfix.rst +++ b/news/13443.bugfix.rst @@ -1,2 +1,2 @@ -Handle malformed version metadata entires and ignore packages +Handle malformed version metadata entries and ignore packages with invalid ``Version`` instead of crashing. diff --git a/src/pip/_internal/metadata/importlib/_dists.py b/src/pip/_internal/metadata/importlib/_dists.py index 4ba311b39a2..5f4ee548e9c 100644 --- a/src/pip/_internal/metadata/importlib/_dists.py +++ b/src/pip/_internal/metadata/importlib/_dists.py @@ -173,9 +173,7 @@ def version(self) -> Version: ) return parse_version(version) except TypeError: - raise BadMetadata( - self._dist.files[3], reason="invalid metadata entry `version`" - ) + raise BadMetadata(self._dist, reason="invalid metadata entry `version`") @property def raw_version(self) -> str: diff --git a/src/pip/_internal/metadata/importlib/_envs.py b/src/pip/_internal/metadata/importlib/_envs.py index 04fb06b82d2..e2b7a8781ab 100644 --- a/src/pip/_internal/metadata/importlib/_envs.py +++ b/src/pip/_internal/metadata/importlib/_envs.py @@ -69,7 +69,7 @@ def _find_impl(self, location: str) -> Iterator[FoundResult]: try: name = get_dist_canonical_name(dist) distribution = Distribution(dist, info_location, None) - version = distribution.version + getattr(distribution, "version") except BadMetadata as e: logger.warning("Skipping %s due to %s", info_location, e.reason) continue From f081bf825b3fd593559360350bfd29c4a06a76e5 Mon Sep 17 00:00:00 2001 From: Sepehr Rasouli Date: Fri, 1 Aug 2025 16:14:53 +0330 Subject: [PATCH 5/7] Update _envs.py --- src/pip/_internal/metadata/importlib/_envs.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/pip/_internal/metadata/importlib/_envs.py b/src/pip/_internal/metadata/importlib/_envs.py index e2b7a8781ab..71a73b7311f 100644 --- a/src/pip/_internal/metadata/importlib/_envs.py +++ b/src/pip/_internal/metadata/importlib/_envs.py @@ -68,8 +68,6 @@ def _find_impl(self, location: str) -> Iterator[FoundResult]: info_location = get_info_location(dist) try: name = get_dist_canonical_name(dist) - distribution = Distribution(dist, info_location, None) - getattr(distribution, "version") except BadMetadata as e: logger.warning("Skipping %s due to %s", info_location, e.reason) continue From 0091c2fa613ac58253cfcc3235d07a4dd359e511 Mon Sep 17 00:00:00 2001 From: Sepehr Rasouli Date: Fri, 1 Aug 2025 16:34:22 +0330 Subject: [PATCH 6/7] Update _dists.py --- src/pip/_internal/metadata/importlib/_dists.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pip/_internal/metadata/importlib/_dists.py b/src/pip/_internal/metadata/importlib/_dists.py index 5f4ee548e9c..89364b8b7ab 100644 --- a/src/pip/_internal/metadata/importlib/_dists.py +++ b/src/pip/_internal/metadata/importlib/_dists.py @@ -28,10 +28,10 @@ from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file from ._compat import ( + BadMetadata, BasePath, get_dist_canonical_name, parse_name_and_version_from_info_directory, - BadMetadata, ) From 7e2ab99e7065887345b2e0cbb973ed0fc22b18f3 Mon Sep 17 00:00:00 2001 From: Sepehr Rasouli Date: Fri, 1 Aug 2025 17:03:23 +0330 Subject: [PATCH 7/7] Update 13443.bugfix.rst --- news/13443.bugfix.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/news/13443.bugfix.rst b/news/13443.bugfix.rst index 0ea95413bd1..68e716392e3 100644 --- a/news/13443.bugfix.rst +++ b/news/13443.bugfix.rst @@ -1,2 +1,2 @@ -Handle malformed version metadata entries and ignore packages -with invalid ``Version`` instead of crashing. +Handle malformed ``Version`` metadata entries and +show a sensible error message instead of crashing.