Skip to content

Commit 911c1aa

Browse files
committed
Fix version-less pin profile override detection
Add managed_version_can_move() to check if profiles or inheritors can provide different managed versions for version-less dependencies. This fixes the bug where a profile's dependencyManagement section or property redefinition could put unpatched JARs on the classpath while attestable_checked stayed silent. The fix checks both: - Profile property redefinitions that change managed version resolution - Profile-specific dependencyManagement entries that differ from base - Inheritor management that provides different versions
1 parent e0c351f commit 911c1aa

1 file changed

Lines changed: 76 additions & 7 deletions

File tree

‎crates/socket-patch-core/src/vendor/jvm/maven_reactor.rs‎

Lines changed: 76 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1808,6 +1808,68 @@ impl Reactor {
18081808
.flatten()
18091809
}
18101810

1811+
/// Whether a profile or inheritor can provide a different managed
1812+
/// version for `g:a` than what `rel` reads from top-level management,
1813+
/// either through profile property redefinition or profile-specific
1814+
/// `<dependencyManagement>` entries.
1815+
fn managed_version_can_move(&self, rel: &str, g: &str, a: &str, base: &str) -> bool {
1816+
// If the base managed version uses properties, check if profiles
1817+
// or inheritors redefine them to produce a different version.
1818+
if base.contains("${") {
1819+
if self
1820+
.version_moved(rel, base, &|v: &str| v != base)
1821+
.is_some()
1822+
{
1823+
return true;
1824+
}
1825+
}
1826+
1827+
// Check if any profile or inheritor has management that provides
1828+
// a different version (profile management or inheritor management).
1829+
std::iter::once(rel)
1830+
.chain(self.inheritors(rel))
1831+
.any(|reader| {
1832+
self.chain(reader).any(|at| {
1833+
let doc = &self.poms[at].doc;
1834+
1835+
// Check profile management entries
1836+
let profile_manages_differently = doc.declarations().into_iter().any(|dep| {
1837+
!doc.is_top_level_managed(dep) && doc.is_main_jar(dep) && {
1838+
let resolve = |v: &str| self.interpolate(reader, v, 0);
1839+
doc.coordinate(dep, "groupId", &resolve).as_deref() == Some(g)
1840+
&& doc.coordinate(dep, "artifactId", &resolve).as_deref() == Some(a)
1841+
&& doc.coordinate(dep, "version", &resolve).as_deref() != Some(base)
1842+
}
1843+
});
1844+
1845+
if profile_manages_differently {
1846+
return true;
1847+
}
1848+
1849+
// For inheritors, check if their top-level management differs
1850+
if reader != rel {
1851+
let inheritor_manages_differently =
1852+
doc.declarations().into_iter().any(|dep| {
1853+
doc.is_top_level_managed(dep) && doc.is_main_jar(dep) && {
1854+
let resolve = |v: &str| self.interpolate(reader, v, 0);
1855+
doc.coordinate(dep, "groupId", &resolve).as_deref() == Some(g)
1856+
&& doc.coordinate(dep, "artifactId", &resolve).as_deref()
1857+
== Some(a)
1858+
&& doc.coordinate(dep, "version", &resolve).as_deref()
1859+
!= Some(base)
1860+
}
1861+
});
1862+
1863+
if inheritor_manages_differently {
1864+
return true;
1865+
}
1866+
}
1867+
1868+
false
1869+
})
1870+
})
1871+
}
1872+
18111873
/// Whether every pom that reads `dep` of `rel` resolves its version
18121874
/// to `sv`: `rel` and each pom inheriting it, with or without a
18131875
/// profile on its chain active (see [`Self::version_moved`]).
@@ -2050,13 +2112,20 @@ impl Reactor {
20502112
// A version-less declaration reads its management: under a
20512113
// local root left unpinned (management conflicting or
20522114
// unresolved outside the checkout) that may be the base.
2053-
if !managed_section
2054-
&& self
2055-
.managed_version(rel, patch.group_id, patch.artifact_id)
2056-
.as_deref()
2057-
!= Some(sv)
2058-
{
2059-
uncertain.insert(at);
2115+
if !managed_section {
2116+
let managed = self.managed_version(rel, patch.group_id, patch.artifact_id);
2117+
if managed.as_deref() != Some(sv)
2118+
|| managed.as_ref().is_some_and(|mv| {
2119+
self.managed_version_can_move(
2120+
rel,
2121+
patch.group_id,
2122+
patch.artifact_id,
2123+
mv,
2124+
)
2125+
})
2126+
{
2127+
uncertain.insert(at);
2128+
}
20602129
}
20612130
continue;
20622131
};

0 commit comments

Comments
 (0)