diff --git a/minecode/collectors/maven.py b/minecode/collectors/maven.py
index 19ba6069..b4db0ec4 100644
--- a/minecode/collectors/maven.py
+++ b/minecode/collectors/maven.py
@@ -163,7 +163,11 @@ def fetch_parent(pom_text, base_url=MAVEN_BASE_URL):
"""Return the parent pom text of `pom_text`, or None if `pom_text` has no parent."""
if not pom_text:
return
- pom = get_maven_pom(text=pom_text)
+ try:
+ pom = get_maven_pom(text=pom_text)
+ except Exception as e:
+ logger.error(f"Failed to parse POM text: {e}")
+ return
if pom.parent and pom.parent.group_id and pom.parent.artifact_id and pom.parent.version.version:
parent_namespace = pom.parent.group_id
parent_name = pom.parent.artifact_id
@@ -289,14 +293,19 @@ def map_maven_package(package_url, package_content, pipelines, priority=0, reind
error += msg + "\n"
logger.error(msg)
return db_package, error
-
- package = _parse(
+ try:
+ package = _parse(
"maven_pom",
"maven",
"Java",
text=pom_text,
base_url=base_url,
- )
+ )
+ except Exception as e:
+ msg = f"Failed to parse POM for {package_url}: {e}"
+ error += msg + "\n"
+ logger.error(msg)
+ return db_package, error
ancestor_pom_texts = get_ancestry(pom_text=pom_text, base_url=base_url)
package = merge_ancestors(ancestor_pom_texts=ancestor_pom_texts, package=package)
diff --git a/minecode/tests/collectors/test_issue_197.py b/minecode/tests/collectors/test_issue_197.py
new file mode 100644
index 00000000..2a913c3f
--- /dev/null
+++ b/minecode/tests/collectors/test_issue_197.py
@@ -0,0 +1,32 @@
+from unittest.mock import patch
+from django.test import TestCase
+from minecode.collectors.maven import fetch_parent, map_maven_package
+from packageurl import PackageURL
+
+class TestIssue197MavenMalformedPom(TestCase):
+ def test_fetch_parent_with_malformed_pom_does_not_crash(self):
+ with patch(
+ "minecode.collectors.maven.get_maven_pom",
+ side_effect=Exception("VersionRangeParseError: Unbounded range: [9"),
+ ):
+ result = fetch_parent(pom_text="")
+ self.assertIsNone(result)
+ def test_map_maven_package_with_malformed_pom_does_not_crash(self):
+ with patch(
+ "minecode.collectors.maven.get_pom_text",
+ return_value="",
+ ):
+ with patch(
+ "minecode.collectors.maven._parse",
+ side_effect=Exception("VersionRangeParseError: Unbounded range: [9"),
+ ):
+ purl = PackageURL.from_string(
+ "pkg:maven/commons-codec/commons-codec@1.16.0"
+ )
+ db_package, error = map_maven_package(
+ package_url=purl,
+ package_content="binary",
+ pipelines=[],
+ )
+ self.assertIsNone(db_package)
+ self.assertIn("Failed to parse POM", error)